Понимание списка Python (оканчивается на if, не занимает ничего) - PullRequest
0 голосов
/ 30 января 2019
conditions = [1, 2, 3, 4]
values = [1, 2, 3, 3]

[print("YAY") for c,v in zip(conditions,values) if c==v]

Это работает, но если я добавляю оператор else, как в следующем примере, возникает синтаксическая ошибка:

[print("YAY") for c,v in zip(conditions,values) if c==v else print("NAY")]

, почему это запрещено делать?имел бы смысл, если бы это сработало (по крайней мере, для меня)

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Для единственного числа if синтаксис:

[print("YAY") for c,v in zip(conditions,values) if c==v]

Это означает:

for c,v in zip(conditions,values):
    if c==v:
        print('YAY')

Для нескольких if и elif и else,синтаксис:

[print("YAY") if c==v else print("lalala") if c=='some other condition' else print("NAY") for c,v in zip(conditions,values)]

Это переводит на

for c,v in zip(conditions,values):
    if c==v:
        print('YAY')
    elif c=='some other condition':
        print('lalala')
    else:
        print('NAY')

Мы можем проверить это:

conditions = [1, 2, 3, 4, 'some other condition']
values = [1, 2, 3, 3, 999]
[print("YAY") if c==v else print("lalala") if c=='some other condition' else print("NAY") for c,v in zip(conditions,values)]
#YAY
#YAY
#YAY
#NAY
#lalala

РЕДАКТИРОВАТЬ: Если вы хотите обрабатывать вложенные циклы forв понимании списка, обратите внимание, что следующий код эквивалентен:

newlist = []
for c in conditions:
    for v in values:
        newlist.append((c,v))
print (newlist)
# [(1, 1), (1, 2), (1, 3), (1, 3), (1, 999), (2, 1), (2, 2), (2, 3), (2, 3), (2, 999), (3, 1), (3, 2), (3, 3), (3, 3), (3, 999), (4, 1), (4, 2), (4, 3), (4, 3), (4, 999), ('some other condition', 1), ('some other condition', 2), ('some other condition', 3), ('some other condition', 3), ('some other condition', 999)]

и

newlist = [(c,v) for c in conditions for v in values]
print (newlist)
#[(1, 1), (1, 2), (1, 3), (1, 3), (1, 999), (2, 1), (2, 2), (2, 3), (2, 3), (2, 999), (3, 1), (3, 2), (3, 3), (3, 3), (3, 999), (4, 1), (4, 2), (4, 3), (4, 3), (4, 999), ('some other condition', 1), ('some other condition', 2), ('some other condition', 3), ('some other condition', 3), ('some other condition', 999)]

Обратите внимание, что for c in conditions является внешним циклом и for v in values является внутренним циклом для обоихфрагменты кода

0 голосов
/ 30 января 2019

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

conditions = [1, 2, 3, 4]
values = [1, 2, 3, 3]

list(map(lambda b: print("YAY") if b else print("NAY"), (c == v for c, v in zip(conditions, values))))
# YAY
# YAY
# YAY
# NAY
...