если еще в списке понимание [дубликат]

этот вопрос уже есть ответ здесь:

у меня есть список l:

l = [22, 13, 45, 50, 98, 69, 43, 44, 1]

для чисел выше 45 включительно, я хотел бы добавить 1; и для чисел меньше чем, 5.

пробовал

[x+1 for x in l if x >= 45 else x+5]

но это дает мне синтаксическая ошибка. Как я могу достичь ifelse как это в списке понимания?

8 ответов


>>> l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
>>> [x+1 if x >= 45 else x+5 for x in l]
[27, 18, 46, 51, 99, 70, 48, 49, 6]

сделай что-нибудь, если <condition>, else do-что-то еще.


причина, по которой вы получаете эту ошибку, как понимание списке производится.

имейте в виду следующее:

[ expression for item in list if conditional ]

эквивалентно:

for item in list:
    if conditional:
        expression

здесь expression находится в несколько другом формате (подумайте, переключая тему и порядок глаголов в предложении).

таким образом, ваш код [x+1 for x in l if x >= 45] это:

for x in l:
    if x >= 45:
        x+1
код [x+1 if x >= 45 else x+5 for x in l] это (после перестановки expression):
for x in l:
    if x>=45: x+1
    else: x+5

[x+1 if x >= 45 else x+5 for x in l]

и за вознаграждение, вот комментарий, я написал, чтобы запомнить это в первый раз, когда я сделал эту ошибку:

условное выражение Python -a if C else b и не может использоваться как:

[a for i in items if C else b]

справа форма:

[a if C else b for i in items]

даже если есть действительная форма:

[a for i in items if C]

но это не то же самое, как вы фильтруете по C, но их можно совместить:

[a if tC else b for i in items if fC]

вы должны поместить выражение в начале понимания списка, оператор if в конце фильтрует элементы!

[x+1 if x >= 45 else x+5 for x in l]

вы также можете поместить условное выражение в скобках внутри списка осмысления:

    l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
    print [[x+5,x+1][x >= 45] for x in l]

[false,true] [условие] - это синтаксис


у меня просто была аналогичная проблема, и я нашел этот вопрос и ответы действительно полезными. Вот что меня смутило. Я пишу это явно, потому что никто на самом деле не заявил Это просто на английском языке:

итерация идет в конце.

обычно цикл идет

for this many times:
    if conditional: 
        do this thing
    else:
        do something else  

каждый утверждает, что часть понимания списка просто, как и первый ответ,

[ expression for item in list if conditional ] 

но это на самом деле не то, что вы делаете в этом случае. (Я пытался сделать это таким образом)

В этом случае, это больше похоже на это:

[ expression if conditional else other thing for this many times ] 

как и в [a if condition1 else b for i in list1 if condition2], два ifС condition1 и condition2 делаем две разные вещи. Часть (a if condition1 else b) из лямбда-выражения:

lambda x: a if condition1 else b

, а другой condition2 еще одна лямбда:

lambda x: condition2

весь список понимания можно рассматривать как комбинацию map и filter:

map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))

вы можете перейти в условии:

v = [22, 13, 45, 50, 98, 69, 43, 44, 1]
[ (x+1 if x >=45 else x+5)  for x in v ]

но это начинает выглядеть немного уродливо, поэтому вам может быть лучше использовать обычный цикл. Обратите внимание, что я использовал v вместо l для переменной списка, чтобы уменьшить путаницу с номером 1 (я думаю l и O следует избегать имен переменных при любых обстоятельствах, даже в быстром и грязном примере кода).