2015-06-27 1 views
4

Учитывая список, например.Как «еще» в понимании списка, когда условие не является логическим?

a = ["No", 1, "No"] 

Я хочу, чтобы преобразовать это в новый список (или на самом деле просто переназначить список) таким образом, что каждый «Нет» преобразуется к 0, например,

[0,1,0] 

Если я пытаюсь следующий список понимание:

[0 for i in a if i =="No"] 

Это, очевидно, приводит список, который опускает каждый элемент, который не является «Нет»

[0,0] 

Если я последовать примеру данные here и попробуйте:

[0 if "No" else i for i in a] 

Это дает мне:

[0, 0, 0] 

И я думаю, это потому, что «Нет» приравнивает к True.

Что я не понимаю об использовании if/else в понимании списка?

+1

Связано также: [Непоследовательный синтаксис понимания?] (Https://stackoverflow.com/q/20025280) –

ответ

4

Сделать это логическое выражение, используя == оператор

>>> a = ["No", 1, "No"] 
>>> [0 if i == "No" else i for i in a] 
[0, 1, 0] 

Или другой путь

>>> [[0, i][i != "No"] for i in a] 
[0, 1, 0] 

Это работает, потому что i != "No" возвращает логическое значение, которое затем может быть истолковано как 1 для Истинного и 0 для ложных. Затем это используется для доступа к этому конкретному элементу из списка [0, i]

+2

или '[int (i! =" Нет ") для i в a] или '[[1,0] [i ==" Нет "] для i в a]';) –

+1

Хе-хе. Хороший трюк @ Падрейк. Но OP хочет напечатать этот элемент в исходном списке, поэтому не может его использовать здесь. :( –

+2

Я думаю '[[0, i] [i! =" Нет "] для i в a]' должен делать трюк –

Смежные вопросы