Если еще в понимании списка

У меня есть список 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 как это в понимании списка?

Ответ 1

>>> 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>, еще что-нибудь еще.

Ответ 2

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

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

[ 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

Ответ 3

[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]

Ответ 4

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

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

Ответ 5

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

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

[false, true] [condition] - это синтаксис

Ответ 6

Вы можете перенести условие на:

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 следует избегать как имена переменных ни при каких обстоятельствах, даже в быстром и грязном пример кода).

Ответ 7

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

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

Обычно цикл проходит

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 ] 

Ответ 8

Как и в [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))