7

Mam prostą listę.Listowanie ze stanem

>>> a = [0, 1, 2] 

Chcę utworzyć z niego nową listę, korzystając ze sprawdzenia listy.

>>> b = [x*2 for x in a] 
>>> b 
[0, 2, 4] 

Całkiem proste, ale co zrobić, jeśli chcę działać tylko na elementach niezerowych?

"jeśli" potrzebuje "innego" w rozumieniu listy, więc wymyśliłem to.

>>> b = [x*2 if x != 0 else None for x in a] 
>>> b 
[None, 2, 4] 

Jednak pożądanym rezultatem jest.

>>> b 
[2, 4] 

mogę zrobić, że ten sposób

>>> a = [0, 1, 2] 
>>> def f(arg): 
...  for x in arg: 
...   if x != 0: 
...    yield x*2 
... 
>>> list(f(a)) 
[2, 4] 

lub za pomocą 'filtra' i lambda

>>> a = [0, 1, 2] 
>>> list(filter(lambda x: x != 0, a)) 
[1, 2] 

Jak uzyskać ten wynik za pomocą listy ze zrozumieniem?

Odpowiedz

12
b = [x*2 for x in a if x != 0] 

jeśli umieścić swój stan na koniec nie potrzebować innego (rzeczywiście nie może mieć innego tam)

+0

Jesteś moim bohaterem. =) – selurvedu

5

Po wzoru:

[ <item_expression> 
    for <item_variables> in <iterator> 
    if <filtering_condition> 
] 

możemy rozwiązać go lubię:

>>> lst = [0, 1, 2] 
>>> [num 
... for num in lst 
... if num != 0] 
[1, 2] 

Chodzi o stworzenie warunku if o wartości "niezerowej".

+0

Dzięki za bardziej szczegółową odpowiedź! – selurvedu

+0

ładna dokładność :) +1 –