один лайнер с подъемом - PullRequest
       5

один лайнер с подъемом

1 голос
/ 25 октября 2019

Как я могу поместить это в одну строку, если это даже возможно?

a = [int(i) if i.isdigit() else raise DnDException("%s is not a number." % i) for i in list_of_strings]

Я хочу сделать следующее:

a = []
for i in list_of_strings:
    if i.isdigit():
        a.append(int(i))
    else:
        raise DnDException("%s is not a number." % i) 

Ответы [ 2 ]

4 голосов
/ 25 октября 2019

Технически возможно для одной строки:

[int(i) if i.isdigit() else (_ for _ in ()).throw(DnDException("%s is not a number." % i)) for i in list_of_strings]

Не говорите никому, что вы слышали это от меня.

Сделайте это вместо этого, гораздо более читабельным:

def func(i):
    if i.isdigit():
        return int(i)
    raise DnDException("%s is not a number." % i) 

a = [func(i) for i in list_of_strings]

Примечание: Будьте внимательны с отрицательными числами, строка "-2" вернет False дляstr.isdigit.

1 голос
/ 25 октября 2019

Хотя технически *1001* технически возможно, как продемонстрировал @wim, удобнее писать что-то вроде следующего, которое также работает с отрицательными и десятичными числами.

try:
    a = list(map(int, list_of_strings))
except ValueError as e:
    raise DnDException(str(e))

Обновление:Похоже, вы также можете сделать это:

class DnDException(Exception):
    def __init__(self, *args):
        super(DnDException, self).__init__(*args)
        raise self

list_of_strings = ["I", "will", "break", "this!", "7", "Haha!"]
a = [int(i) if str.isdigit(i) else DnDException("%s is not a number." % i) for i in list_of_strings]
...