if / else в понимании списка Python?

Как я могу сделать следующее в Python?

row = [unicode(x.strip()) for x in row if x is not None else '']

по сути:

  1. замените все Nones пустыми строками, а затем
  2. выполнить функция.

5 ответов


вы можете полностью сделать это, это просто вопрос заказ:

[ unicode(x.strip()) if x is not None else '' for x in row ]

обратите внимание, что это фактически использует другую языковую конструкцию, a условное выражение, который сам по себе не является частью синтаксис понимания, а if после for…in является частью списка понимания и используется для фильтр элементы из исходного iterable.

условные выражения могут использоваться во всех ситуациях, когда вы хотите выбрать между двумя значениями выражения на основе некоторого условия. Это делает то же самое, что и тернарный оператор ?: который существует на других языках. Например:

value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')

одним из способов:

def change(f):
    if f is None:
        return unicode(f.strip())
    else:
        return ''

row = [change(x) for x in row]

хотя тогда у вас есть:

row = map(change, row)

или вы можете использовать лямбда-рядный.


вот еще один наглядный пример:

>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
Ha, ha, ha!

он использует тот факт, что if i значение False на 0 и True для всех других значений, генерируемых функцией range(). Поэтому понимание списка оценивается следующим образом:

>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']

конкретная проблема уже решена в предыдущих ответах,поэтому я рассмотрю общую идею использования условных обозначений внутри списков.

вот пример, который показывает, как условия могут быть записаны внутри списка осмысления:

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 if not isinstance(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' if isinstance(el, str) else el for el in X]  # When using 'if' and 'else', put 'for' in the end

обратите внимание, что в первом списке понимание для X_non_str заказ:

стоимостью на expression1 если expression2

и в последнем списке понимание для X_str_changed заказ:

value1 если expression1 другое value2 на expression2

мне всегда трудно это запомнить value1 перед если и value2 должен быть после другое. Моя голова хочет быть и до, и после.

Я думаю, что он разработан так, потому что он напоминает нормальный язык, например: "я хочу остаться внутри если дожди, другое я хочу выйти наружу"


другие решения отлично подходят для одного if / else строительство. Однако троичные утверждения в рамках понимания списка, возможно, трудно читать.

использование функции помогает читаемости, но такое решение трудно расширить или адаптировать в рабочем процессе, где отображение является входным. Словарь может облегчить эти проблемы:

row = [None, 'This', 'is', 'a', 'filler', 'test', 'string', None]

d = {None: '', 'filler': 'manipulated'}

res = [d.get(x, x) for x in row]

print(res)

['', 'This', 'is', 'a', 'manipulated', 'test', 'string', '']