Ответ 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>
, еще что-нибудь еще.
У меня есть список 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]
Но это дает мне синтаксическую ошибку. Как я могу достичь if
– else
как это в понимании списка?
>>> 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>
, еще что-нибудь еще.
Причина, по которой вы получаете эту ошибку, связана с тем, как выполняется понимание списка.
Имейте в виду следующее:
[ 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] [condition] - это синтаксис
Вы можете перенести условие на:
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
следует избегать как имена переменных ни при каких обстоятельствах, даже в быстром и грязном пример кода).
У меня была аналогичная проблема, и я нашел этот вопрос, и ответы действительно полезны. Здесь часть меня смутила. Я пишу это явно, потому что никто на самом деле не сказал это просто по-английски:
Итерация идет в конце.
Обычно цикл проходит
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))