Есть ли способ выполнить два оператора на основе <условие> в одной строке?
Можно ли написать одну строку следующим образом: <statement> if <cond> else <statement>
, Я не имею в виду что-то вроде a = 1 if 1 else 2
,
Пример:
У меня есть список p
это само по себе имеет списки. Давайте предположим, что я получаю вход inputIter
, Я хотел бы сделать следующее:
for input in inputIter:
if <condition>: p+=[[input]] # generate new list
else: p[-1]+=[input] # append to latest list
Тогда я подумал про себя, что должен быть способ сделать это однострочным, поэтому я попробовал это:
for input in inputIter:
p+=[[input]] if <condition> else p[-1]+=[input]
Но это порождает
Syntax error: invalid syntax ^
(где =
я сидела). Есть ли обходной путь? Я знаю, что это не лучший пример. Я знаю, это может выглядеть немного некрасиво. Но на мой взгляд это читабельно.
1 ответ
Вы не можете смешивать заявления в назначениях, нет.
Назначение это утверждение (=
, +=
, так далее.). Оператор присваивания содержит выражение (все справа от =
), но сам по себе он не может использоваться внутри выражения. Для этого есть особая причина: присваивания в выражении приводят к труднодоступным ошибкам. Классический пример - запутанное тестирование на равенство (==
) с назначением:
if x = 0:
# oops, that wasn't a test..
Смотрите Python FAQ.
Вы пытаетесь переключаться между присваиваниями в условном выражении, а это не разрешено в Python.
Просто используйте if
заявления; в вашем конкретном примере вы могли бы использовать:
for input in inputIter:
if <condition>:
p.append([]) # generate new list
p[-1].append(input)
Это всегда добавляется к последнему вложенному списку, но когда <condition>
новый, пустой список добавляется в конце первым.