Понятие однострочного списка: варианты if-else

Это больше о синтаксисе понимания списка python. У меня есть список, который создает список нечетных чисел заданного диапазона:

[x for x in range(1, 10) if x % 2]

Это делает фильтр - у меня есть список источников, где я удаляю четные числа (if x % 2). Я хотел бы использовать что-то вроде if-then-else здесь. Не удалось выполнить следующий код:

>>> [x for x in range(1, 10) if x % 2 else x * 100]
  File "<stdin>", line 1
    [x for x in range(1, 10) if x % 2 else x * 100]
                                         ^
SyntaxError: invalid syntax

Существует выражение python, подобное if-else:

1 if 0 is 0 else 3

Как использовать его в понимании списка?

Ответ 1

x if y else z - это синтаксис выражения, которое вы возвращаете для каждого элемента. Таким образом, вам нужно:

[ x if x%2 else x*100 for x in range(1, 10) ]

Путаница возникает из-за того, что вы используете фильтр в первом примере, но не во втором. Во втором примере вы только сопоставляете каждое значение с другим, используя выражение тернарного оператора.

С фильтром вам нужно:

[ EXP for x in seq if COND ]

Без фильтра вам нужно:

[ EXP for x in seq ]

а во втором примере выражение является "сложным", в котором участвует if-else.

Ответ 2

[x if x % 2 else x * 100 for x in range(1, 10) ]

Ответ 3

Еще одно решение, надеюсь, кому-то это понравится:

Использование: [False, True] [Expression]

>>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>

Ответ 4

Вы можете сделать это с помощью понимания списка:

A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
print A

Ответ 5

Я смог сделать это

>>> [x if x % 2 != 0 else x * 100 for x in range(1,10)]
    [1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>