Вы вполне можете это сделать. Это просто проблема с порядком:
[f(x) if x isnotNoneelse''for x in xs]
В общих чертах,
[f(x) if condition else g(x) for x in sequence]
И, только для понимания списка с if условиями,
[f(x) for x in sequence if condition]
Обратите внимание, что на самом деле здесь используется другая языковая конструкция, условное выражение, которое само по себе не является частью синтаксиса понимания, в то время как if после for…in является частью понимания списка и используется для фильтрации элементов из исходного итерируемого.
Условные выражения можно использовать во всех видах ситуаций, когда вы хотите выбрать одно из двух значений выражения на основе некоторого условия. Это делает то же самое, что и троичный оператор ?:, который существует в других языках. Например:
value = 123 print(value, 'is', 'even'if value % 2 == 0else'odd')
Ответ 2
Давайте воспользуемся этим вопросом для обзора некоторых концепций. Я думаю, что сначала полезно ознакомиться с основными принципами, чтобы вы могли экстраполировать их на различные случаи.
Другие ответы дают конкретный ответ на ваш вопрос. Сначала я приведу некоторый общий контекст, а затем отвечу на вопрос.
Основы
if/else инструкции в понимании списка включают две вещи:
Его структура состоит из: "скобки, содержащие выражение, за которым следует предложение for, затем ноль или более предложений for или if".
Пример 1
Здесь у нас нет условия. Каждый элемент из итерируемого добавляется в new_list.
new_list = [expression for item in iterable] new_list = [x for x inrange(1, 10)] > [1, 2, 3, 4, 5, 6, 7, 8, 9]
Пример 2
Здесь у нас есть одно условие.
Пример 1
Условие: в будут добавлены только четныеnew_list числа.
new_list = [expression for item in iterable if condition == True] new_list = [x for x inrange(1, 10) if x % 2 == 0] > [2, 4, 6, 8]
Пример 2
Условие: в будут добавлены только четныеnew_list числа, кратные 3.
new_list = [expression for item in iterable if condition == True] new_list = [x for x inrange(1, 10) if x % 2 == 0if x % 3 == 0] > [6]
Но почему у нас есть одно условие, если мы используем два if в new_list?
Предыдущее выражение может быть записано как:
new_list = [x for x inrange(1, 10) if x % 2and x % 3 == 0] > [6]
Мы используем только один оператор if.
Это похоже на выполнение:
new_list = [] for x inrange(1, 10): if x % 2 == 0and x % 3 == 0: new_list.append(x) > [6]
Пример 3
Просто ради аргументации вы также можете использовать or.
Условие: в будут добавлены четныеnew_list числа или числа, кратные 3.
new_list = [x for x inrange(1, 10) if x % 2 == 0or x % 3 == 0] > [2, 3, 4, 6, 8, 9]
Пример 3
Более одного условия:
Здесь нам понадобится помощь условных выражений (троичных операторов).
2.Условные выражения
Что такое условные выражения? О чем говорит название: выражение Python, имеющее некоторое условие.
<Exp1> if condition else <Exp2>
Сначала вычисляется condition. Если condition есть True, то <Exp1> вычисляется и возвращается. Если condition есть False, то <Exp2> вычисляется и возвращается.
Условное выражение с более чем одним условием:
<Exp1> if condition else <Exp2> if condition else <Exp3>...
Конкретная проблема уже была решена в предыдущих ответах, поэтому я рассмотрю общую идею использования условных выражений внутри понимания списка.
Вот пример, который показывает, как условные выражения могут быть записаны внутри понимания списка:
X = [1.5, 2.3, 4.4, 5.4, 'n', 1.5, 5.1, 'a'] # Original list
# Extract non-strings from X to new list X_non_str = [el for el in X ifnotisinstance(el, str)] # When using only 'if', put 'for' in the beginning
# Change all strings in X to 'b', preserve everything else as is X_str_changed = ['b'ifisinstance(el, str) else el for el in X] # When using 'if' and 'else', put 'for' in the end
Обратите внимание, что в первом понимании списка для X_non_str порядок такой:
выражениедляэлементавповторяемомусловииif
и в последнем понимании списка для X_str_changed порядок такой:
Мне всегда трудно запомнить, что expression1 должно быть перед if, а expression2 должно быть после else. Моя голова хочет, чтобы оба были либо до, либо после.
Я думаю, это разработано так, потому что напоминает обычный язык, например "Я хочу остаться внутри, если пойдет дождь, иначе я хочу выйти наружу"
Простым английским упомянутые выше два типа понимания списка могут быть сформулированы как: