Как я могу сделать следующее в Python?
row = [unicode(x.strip()) for x in row if x is not None else '']
По существу:
- заменить все Nones пустыми строками, а затем
- выполнять функцию.
python
list-comprehension
AP257
источник
источник
Ответы:
Вы можете сделать это полностью. Это просто вопрос заказа:
В основном,
И, для понимания списка
if
только с условиями,Обратите внимание, что на самом деле используется другая языковая конструкция, условное выражение , которое само по себе не является частью синтаксиса понимания , в то время
if
как символ послеfor…in
является частью понимания списка и используется для фильтрации элементов из итерируемого источника.Условные выражения могут использоваться во всех видах ситуаций, когда вы хотите выбирать между двумя значениями выражений на основе некоторого условия. Это делает то же самое, что троичный оператор,
?:
который существует в других языках . Например:источник
l = [ 2, 3, 4, 5]
то[x if x % 2 == 0 for x in l]
дай мне ошибку, тогда как[x if x % 2 == 0 else 200 for x in l]
работает. Да, я знаю, чтобы отфильтровать это, я должен написать[ x for x in l if x % 2 == 0]
. Извините за беспокойство. Спасибо за Ваш ответ.В одну сторону:
Хотя тогда у вас есть
Или вы можете использовать лямбда-инлайн.
источник
if
выражения или кода в егоelse
блоке операторов или s. Принятый ответ лучше для простых случаев.Вот еще один иллюстративный пример:
Он использует тот факт, что
if i
оцениваетFalse
для0
иTrue
для всех других значений, сгенерированных функциейrange()
. Поэтому понимание списка оценивается следующим образом:источник
Конкретная проблема уже была решена в предыдущих ответах, поэтому я остановлюсь на общей идее использования условных выражений в списках.
Вот пример, который показывает, как условные выражения могут быть записаны в понимании списка:
Обратите внимание, что в первом понимании списка
X_non_str
, порядок:и в последнем понимании списка
X_str_changed
, порядок:Мне всегда трудно вспомнить, что expresseion1 должен быть до, если и expression2 должен быть после else . Моя голова хочет, чтобы оба были либо до, либо после.
Я предполагаю, что это разработано так, потому что это напоминает нормальный язык, например: «Я хочу оставаться внутри, если идет дождь, иначе я хочу выйти на улицу»
В простом английском языке два типа перечисленных выше пониманий списка могут быть сформулированы как:
Только с
if
:и с
if/else
источник
Другие решения отлично подходят для одного
if
/else
конструкции. Тем не менее, троичные утверждения в пределах понимания списка, вероятно, трудно читать.Использование функции способствует удобочитаемости, но такое решение сложно расширить или адаптировать в рабочем процессе, где отображение является входным. Словарь может облегчить эти проблемы:
источник
Это связано с тем, как выполняется понимание списка.
Имейте в виду следующее:
Эквивалентно:
Где
expression
в немного другом формате (подумайте о переключении темы и порядка глаголов в предложении).Следовательно, ваш код
[x+1 for x in l if x >= 45]
делает это:Тем не менее, этот код
[x+1 if x >= 45 else x+5 for x in l]
делает это (после перестановкиexpression
):источник
Нет необходимости в троичной системе if / then / else. На мой взгляд, ваш вопрос требует этого ответа:
источник
Кажется, лучше сначала обобщить все возможные формы, чем давать конкретные ответы на вопросы. В противном случае читатель не узнает, как был определен ответ. Вот несколько обобщенных форм, которые я придумал до того, как у меня заболела голова, пытаясь решить, можно ли использовать последний пункт в последней форме.
Значение
item
не нужно использовать ни в одном из условных предложений. Aconditional3
можно использовать как переключатель для добавления или не добавления значения в список вывода.Например, чтобы создать новый список, который исключает пустые строки или строки пробелов из исходного списка строк:
источник
this if condition else that
разрешено только или нормальное выражение. Нетvalue = this if condition
(что может быть достигнуто с помощьюvalue = this if condition else None
)Вы можете комбинировать условную логику в понимании:
источник
(venv) $ python list_comp.py
Affichage de my_list [0, 1, 2, 3, 4, 5]
Affichage de my_result_list [0, 5, 4, 7, 8, 9]
Итак, для вас:
row = [('', unicode(x.strip()))[x is not None] for x in row]
источник