2012-04-03 18 views
61

elifをリスト内包に使用できますか?リスト内包表記内の「elif」

例:

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

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

は、我々は上記のコードと同様の方法で、私たちのリスト内包でelifを含めることはできますか?例えば

、などの答え:これまでは

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

は、私はリスト内包でifelseを使用しています。

答えて

132

Pythonのは、ユースケースのこの種のために正確に設計されたconditional expressions

>>> 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'] 

希望これは

+8

を私はいくつかのinterestiがありますどのようにこれらのチェーン一緒 – jamylak

+1

好きシンタックスの履歴。導入前の何年もの間、「第三の表現」は、言語の最も要求の高い5つの変化の1つでした。 Guido van Rossumは明示的にステートメントベースの言語として設計して以来、彼は長年にわたってしっかりと抵抗していました(第三次表現、特にそれらの乱用はコードではあいまいである)。彼が最終的に負けたとき、彼は意図的に過度の使用を阻む構文を選択したと発表した。それにもかかわらず、彼はいつものようにエレガントなデザインの仕事をしました。 – holdenweb

+1

Ternary、dammit(彼は手紙を書いて、彼の難読性ミスを編集するのは遅すぎた)。 – holdenweb

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

私はこのフォームは、リストcomp内で本当に長くて複雑なif/elseロジックを実行しようとするよりも消化しやすいと思います。 – jdi

+5

@ jdi条件式はあなたの好みに合わないかもしれませんが、OPが要求したように、if-elif-elif-elseチェーンを扱うように特別に設計されました。グレード> = 90の場合は 'A'、グレード> = 80の場合は 'B'、グレード> = 80の場合は 'C'それ以外の場合は 'C' 70 else 'F'''。 –

+0

理解の外に 'd'を定義する利点があれば? –

1

あなたはリストの内包表記を使用することができますが、別のリストを作成しようとしているされ:-)に役立ちますオリジナルから。

>>> 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'] 
13

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

あなたがもし/他の事業者の三部形式を使用している(あなたがCのような言語に精通している場合、これは?:構造のようなものです:あなたが同じようsytaxを使用するときにすることを

(v == 1 ? 'yes' : 'no') )。

場合/他のオペレータが内蔵「のelif」を持っていませんが、あなたは「他」の状態でそれをシミュレートすることができますの三部形式:

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

これは言ってようなものです:

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

あなたが質問したように、直接 'elif'構造はありませんが、ネストされたif/elseステートメントでシミュレートできます。

1

もう1つの簡単な方法は、このような条件付きのリストの内包表記を使用することです:

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

はあなたに正しいanwerを与える:

[ 'はい'、 'いいえ'、 'アイドル'、 'アイドル'、 ]「アイドル」

0

たぶん、あなたはこの希望:

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

print ([['idle','no','yes'][2*(n==1)+(n==2)] for n in l]) 
関連する問題