Chodzi bardziej o składnię rozumienia list w Pythonie. Mam listę, która tworzy listę liczb nieparzystych z danego zakresu:
[x for x in range(1, 10) if x % 2]
To tworzy filtr - mam listę źródeł, z której usuwam liczby parzyste ( if x % 2
). Chciałbym użyć tutaj czegoś takiego jak if-then-else. Poniższy kod nie działa:
>>> [x for x in range(1, 10) if x % 2 else x * 100]
File "<stdin>", line 1
[x for x in range(1, 10) if x % 2 else x * 100]
^
SyntaxError: invalid syntax
Istnieje wyrażenie Pythona, takie jak if-else:
1 if 0 is 0 else 3
Jak go używać w ramach rozumienia listy?
()
zamiast[]
.if x % 2
eliminuje liczby parzyste (zamiast je zachować) - dzieje się tak dlatego, że kiedyx
jest nawetx % 2
wynikiem wyrażenia0
, które z kolei jest wartościowane doFalse
, podczas gdy każdyint
z wyjątkiem0
oblicza doTrue
.Odpowiedzi:
x if y else z
to składnia wyrażenia, które zwracasz dla każdego elementu. Potrzebujesz więc:Nieporozumienie wynika z faktu, że w pierwszym przykładzie używasz filtra , ale nie w drugim. W drugim przykładzie jesteś tylko mapowanie każdej wartości do drugiego, używając wyrażenia trójargumentowy-operatora.
Z filtrem potrzebujesz:
Bez filtra potrzebujesz:
aw twoim drugim przykładzie wyrażenie jest „złożone”, które obejmuje rozszerzenie
if-else
.źródło
[x for x in range(1, 10) if x % 2]
jest poprawna składnia.[x if x % 2 for x in range(1, 10)]
- to nie jest, ale[x if x%2 else x*100 for x in range(1, 10)]
znowu jest, poprawna składnia. Dlaczego?else
), ani filtr (ponieważ znajduje się naEXP
części listy)if
na końcu możesz dodać drugi :[x if x%2 else x*100 for x in range(1, 10) if not x%3]
pierwszyif
jest częścią operatora trójskładnikowego, a drugiif
jest częścią składni list złożonych. Całośćx if x%2 else x*100
jest „na tym samym poziomie” co proste2*x
, jest to wyrażenie do oceny po lewej stroniefor
, gdy filtrowanieif not x%3
już miało miejsce.for i in x:
a następnie w pętli forif i == y:
?źródło
Możesz to zrobić również ze zrozumieniem listy:
źródło
Jeszcze jedno rozwiązanie, mam nadzieję, że komuś się spodoba:
Używanie: [False, True] [Expression]
źródło
Udało mi się to zrobić
źródło