Является ли if / else / если возможно в понимании списка? - PullRequest
3 голосов
/ 16 марта 2012

Я хотел бы знать, возможно ли использовать списочное понимание с if / else, которое не должно приводить к списку такой же длины, как длина обрабатываемого списка?(т.е. без финала else)

>>> L = [0, 1, 2, 3, 4, 5, 6]
>>> [v * 10 if v < 3 else v * 2 if v > 3 else v for v in L] #if/else/if/else
[0, 10, 20, 3, 8, 10, 12]

работает нормально.Но предположим, что я хочу опустить 3, чтобы получить:

[0, 10, 20, 8, 10, 12]  # No number 3

Я бы подумал, что это будет работать:

>>> [v * 10 if v < 3 else v * 2 if v > 3 for v in L] #if/else/if

Но это синтаксическая ошибка ..

Так что я подумал «может быть», это сработает:

>>> [v * 10 if v < 3 else v * 2 if v > 3 else pass for v in L] #if/else/if/else pass

Но это не так.

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

Я что-то упустил?Это можно сделать?(Я на питоне 2.6.5)

Ответы [ 4 ]

14 голосов
/ 16 марта 2012

Да, это возможно:

[foo for foo in bar if foo.something]

Или в вашем случае:

[v * 10 if v < 3 else v * 2 for v in L if v != 3]

Я также упоминал в документах .

4 голосов
/ 16 марта 2012

Поместите условие фильтрации после цикла:

 [v * 10 if v < 3 else v * 2 for v in L if v != 3]

возвращает

[0, 10, 20, 8, 10, 12]
0 голосов
/ 29 июня 2014
    A=[[x*2, x*10][x <3] for x in L if x!=3]
0 голосов
/ 16 марта 2012

Что не так с

out = []
for v in L:
    if v < 3:
        out.append(v * 10)
    elif v > 3:
        out.append(v * 2)
    else:
        pass
...