Понятие однострочного списка: варианты 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]
>>>