Tek satırlık liste anlama: if-else değişkenleri


178

Daha çok python listesi anlama sözdizimi ile ilgilidir. Belirli bir aralıktaki tek sayıların listesini üreten bir liste kavrayışım var:

[x for x in range(1, 10) if x % 2]

Bu bir filtre yapar - çift sayıları ( if x % 2) kaldırdığım bir kaynak listem var . Burada if-then-else gibi bir şey kullanmak istiyorum. Aşağıdaki kod başarısız oluyor:

>>> [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

İf-else gibi bir python ifadesi vardır:

1 if 0 is 0 else 3

Bir liste kavrayışı içinde nasıl kullanılır?


1
Değeri ne olursa olsun, bir jeneratör değil, bir "liste kavrama" var. Nihai sözdizimi, jeneratörlerin ()yerine kullanması dışında aynıdır [].
mgilson


2
Nedenini almak için biraz zaman aldı if x % 2 ortadan kaldırır çift sayılar (yerine onları tutmanın) - bu olduğunda, çünkü xbile olduğu x % 2içinde ifade sonuçlar 0, hangi sırayla, değerlendirir False, herhangi süre inthariç 0hiç değerlendirir True.

Yanıtlar:


328

x if y else zher öğe için döndürdüğünüz ifadenin sözdizimidir. Böylece ihtiyacınız olan:

[ x if x%2 else x*100 for x in range(1, 10) ]

Karışıklık , ilk örnekte bir filtre kullandığınızdan kaynaklanır , ancak ikincisinde değil. İkinci örnekte yalnızca konum haritalama bir üçlü-operatör ifadesini kullanarak, başka her değer.

Bir filtre ile şunlara ihtiyacınız vardır:

[ EXP for x in seq if COND ]

Bir filtre olmadan şunlara ihtiyacınız vardır:

[ EXP for x in seq ]

ve ikinci örneğinizde, ifade bir "karmaşık" ifadedir if-else.


2
Bir sorum var ... [x for x in range(1, 10) if x % 2]doğru sözdizimi. [x if x % 2 for x in range(1, 10)]- bu [x if x%2 else x*100 for x in range(1, 10)]sözdizimi değil , yine doğrudur. Nasıl olur?
ducin

@tkoomzaaskz ikinci örneğinizde, bu ne bir üçlü if-operatörü (eksik else), ne de bir filtre ( EXPlistenin kavranmasının bir parçası olduğu için)
shx2

3
@tkoomzaaskz Daha fazla açıklığa kavuşturmak ifiçin, sonuna bir saniye ekleyebileceğinizi unutmayın : [x if x%2 else x*100 for x in range(1, 10) if not x%3]Birincisi ifüçlü operatörün bir ifparçası , ikincisi liste anlama sözdiziminin bir parçasıdır. Bütün x if x%2 else x*100, basit olarak "aynı seviyede" dir , filtrelemenin zaten 2*xgerçekleştiği zamanın sol tarafında değerlendirilecek ifadedir . forif not x%3
zx81

Merhaba, tek satırlık bir ifade for i in x:, for döngüsü gibi ve sonra iki satırda yapmaktan daha performanslı olur if i == y:mu?
Alexis.Rolland

23
[x if x % 2 else x * 100 for x in range(1, 10) ]

12

Bunu liste kavrayışıyla da yapabilirsiniz:

A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
print A

1
Çok hoş. Boole dilimi. Teşekkürler bana daha kolay okunabilir bir çözüm verdiniz.

Ayrıca şöyle atayabilirsiniz: A, B = [10,11] [a == 19], [1,14] [a == 20]
Stefan Gruenwald

10

Sadece başka bir çözüm, umarım bazıları beğenebilir:

Kullanılıyor: [Yanlış, Doğru] [İfade]

>>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>

3

Bunu yapabildim

>>> [x if x % 2 != 0 else x * 100 for x in range(1,10)]
    [1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.