Эквивалент Haskell Пример понимания списка в Python - PullRequest
0 голосов
/ 10 апреля 2020

Мне было интересно, может ли следующий List comprehension пример из learnyoua haskell .com быть скопирован в Python:

[ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]   

Я пробовал что-то подобное , но не удалось получить эквивалент пути else для работы в Python Списке:

["BOOM!" for x in range(7,13) if x < 10] # else "BANG!"

Ответы [ 3 ]

7 голосов
/ 10 апреля 2020

Это не фильтрация, а троичный оператор, который вы вводите в yield части понимания списка. Однако есть фильтр: часть odd x, поэтому вы должны добавить фильтр if x % 2 == 1 в конце списка:

[<b>"BOOM!" if x < 10 else "BANG!"</b> for x in range(7,13) if x % 2 == 1]

В Python это дает нам:

>>> ["BOOM!" if x < 10 else "BANG!" for x in range(7,13) if x % 2 == 1]
['BOOM!', 'BOOM!', 'BANG!']

Что эквивалентно в Haskell:

Prelude> [ if x < 10 then "BOOM!" else "BANG!" | x <- [7 .. 12], odd x]  
["BOOM!","BOOM!","BANG!"]
1 голос
/ 10 апреля 2020

Вы можете поместить if-else как выражение, которое оценивается пониманием

['BOOM!' if x < 10 else 'BANG!' for x in range(7, 13)]
0 голосов
/ 10 апреля 2020

Просто переместите это так:

["BOOM!" if x < 10 else "BANG!" for x in range(7,13) ]
...