Liste anlama koşullarında "elif"


129

elifListe anlamada kullanabilir miyiz ?

Misal :

l = [1, 2, 3, 4, 5]

for values in l:
    if values==1:
        print 'yes'
    elif values==2:
        print 'no'
    else:
        print 'idle'

Biz içerebilir elifyukarıdaki koda benzer bir şekilde bizim liste anlama?

Örneğin, şöyle bir cevap:

['yes', 'no', 'idle', 'idle', 'idle']

Şimdiye kadar sadece kullandım ifve elseliste anlamında.

Yanıtlar:


250

Python'un koşullu ifadeleri tam olarak bu tür bir kullanım durumu için tasarlandı:

>>> l = [1, 2, 3, 4, 5]
>>> ['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l]
['yes', 'no', 'idle', 'idle', 'idle']

Bu yardımcı olur umarım :-)


5
Sözdiziminde ilginç bir tarih var. Girişlerinden yıllar önce "üçüncül ifadeler", dilde en çok talep edilen beş değişiklikten biriydi. Guido van Rossum bunu açıkça ifade temelli bir dil olarak tasarladığından, uzun süre sıkıca direndi (üçüncül ifadeler ve özellikle bunların kötüye kullanılması, kodda çok belirsizlik kaynaklarıdır). Sonunda yenik düştüğünde, bilinçli olarak aşırı kullanımı engelleyen bir sözdizimi seçtiğini duyurdu. Her zamanki gibi yine de zarif bir tasarım işi yaptı.
holdenweb

1
Üçlü, kahretsin (yazdı, disleksik hatasını düzeltmek için çok geç fark etti).
holdenweb

2
Bu cevaba oy verirken, bundan bahsetmek istiyorum: 1 çift if / else okunması kolay, 2 çift: anlaşılması zorlaşıyor. 3 çiftten bahsetme bile. İfadenin 3 veya daha fazla çifte ihtiyacı varsa, bir sözlük veya ayrı bir işlev, şeyleri okumayı ve anlamayı kolaylaştırır.
Hai Vu

1
Bu problem için bir çözüm değil, temiz kod için bir hatırlatma eklemek istiyorum: bu liste anlayışının üç koşulu olduğundan, muhtemelen daha açıklayıcı bir yönteme dönüştürülebilir. Demek istediğim şu: martinfowler.com/bliki/FunctionLength.html :)
Alvaro Cavalcanti

Bir elife ihtiyacım olan bir vakaya rastladım, ancak sadece iki değere. Bu örneği kullanarak, sadece ['yes', 'no']yapılmalıydım. Bunu yapmak için, bunu yapabilirsiniz: ['yes' if v == 1 else 'no' for v in l if values in [1,2]]. Şu anda bunu yapmanın daha temiz bir yolunu düşünemiyorum.
dTanMan

48
>>> d = {1: 'yes', 2: 'no'}
>>> [d.get(x, 'idle') for x in l]
['yes', 'no', 'idle', 'idle', 'idle']

4
Bence bu form, listedeki gerçekten uzun ve karmaşık if / else mantığını yapmaya çalışmaktan çok daha kolay sindirilebilir
jdi

5
@jdi Koşullu ifadeler zevkinize uygun olmayabilir , ancak OP'nin istediği gibi if-elif-elif-else zincirlerini işlemek için özel olarak tasarlanmıştır. Onlar öğrenmek zor değildir ve incelikle sözlük arama mantığına olarak uygun olmayan durumlarla işleyebilir: 'A' if grade>=90 else 'B' if grade>=80 else 'C' if grade>=70 else 'F'.
Raymond Hettinger

1
Anlamanın ddışında tanımlamanın bir avantajı var mı?
Chris_Rands

Liste anlayışını daha çok sevmemin nedeni tıpkı İngilizce gibi okunması. Programcı olmayan biri bile ne yaptığını anlayabilir. Bu çözümle, dict.get () yöntemini anlamalısınız.
Tim Skov Jacobsen

26

Yapabilirsin, bir nevi.

Sytax'ı aşağıdaki gibi kullandığınızda unutmayın:

['yes' if v == 1 else 'no' for v in l]

İf / else operatörünün üçlü biçimini kullanıyorsunuz (C gibi dillere aşinaysanız, bu yapı gibidir ?::) (v == 1 ? 'yes' : 'no').

İf / else operatörünün üçlü formunda yerleşik bir 'elif' yoktur, ancak bunu 'else' durumunda simüle edebilirsiniz:

['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l]

Bu demek gibidir:

for v in l:
    if v == 1 :
        print 'yes'
    else:
        if v == 2:
            print 'no'
        else:
            print 'idle'

Yani sorduğunuz gibi doğrudan bir 'elif' yapısı yoktur, ancak iç içe geçmiş if / else ifadeleri ile simüle edilebilir.


1
Son paragraf kodu çok anlayışlı, teşekkürler!
devianceee

3

Belki bunu istiyorsun:

l = [1, 2, 3, 4, 5] 

print ([['idle','no','yes'][2*(n==1)+(n==2)] for n in l])

2

Orijinalden başka bir liste oluşturacaksanız, liste anlama özelliğini kullanabilirsiniz.

>>> l = [1, 2, 3, 4, 5]
>>> result_map = {1: 'yes', 2: 'no'}
>>> [result_map[x] if x in result_map else 'idle' for x in l]
['yes', 'no', 'idle', 'idle', 'idle']

2

Diğer bir kolay yol, koşullu liste anlamayı şu şekilde kullanmaktır:

l=[1,2,3,4,5]
print [[["no","yes"][v==1],"idle"][v!=1 and v!=2] for v in l]

size doğru cevabı verir:

["evet", "hayır", "boşta", "boşta", "boşta"]

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.