Есть ли способ выполнить два оператора на основе <условие> в одной строке?

Можно ли написать одну строку следующим образом: <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> новый, пустой список добавляется в конце первым.

Другие вопросы по тегам