リスト内包条件の `elif`


128

使えますか 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']

これまでは、リスト内包表記のみを使用ifしてきelseました。

回答:


249

Pythonの条件式は、このようなユースケースに合わせて設計されています。

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

お役に立てれば :-)


5
構文にはいくつかの興味深い歴史があります。彼らが導入される前の何年もの間、「三次表現」は言語で最も要求された5つの変更の1つでした。Guido van Rossumは明示的にステートメントベースの言語として設計したため、長い間しっかりと抵抗しました(3次式、特にその悪用は、コードの多くのあいまいさの原因です)。彼がついに倒れたとき、彼は乱用を防ぐ構文を故意に選択したと発表しました。それでもいつものように、彼はエレガントなデザインの仕事をしました。
holdenweb 2018年

1
Ternary、くそったれ(彼は失読症の間違いを遅すぎて編集できないことに気付いて書いた)。
holdenweb 2018年

2
私がこの回答に賛成票を投じている間、私はこれについて言及したいと思います。if/ elseの1ペアは読みやすく、2ペアは理解しづらくなっています。3ペアについても言及しないでください。式に3つ以上のペアが必要な場合は、辞書または別の関数を使用すると、読みやすく、理解しやすくなります。
Hai Vu

1
この問題の解決策ではなく、クリーンなコードを思い出させるために追加したいと思います。このリスト内包表記には3つの条件があるため、おそらくより記述的な方法にリファクタリングできます。私のポイントはこれです:martinfowler.com/bliki/FunctionLength.html :)
Alvaro Cavalcanti

elifが必要なケースに偶然出会いましたが、値は2つだけでした。この例を使用すると、私は単に['yes', 'no']作られる必要があったでしょう。これを行うには、次のようにします ['yes' if v == 1 else 'no' for v in l if values in [1,2]]。現在、これを行うためのより明確な方法は考えられません。
dTanMan

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

4
このフォームは、リストコンプ内で非常に長く複雑なif / elseロジックを実行するよりも、簡単に消化できると思います
jdi

5
@jdi条件付き式はあなたの好みにならないかもしれないが、それらがされた、特にOPは、要求されたと同じように、場合-elifの- elifの-他のチェーンハンドルに設計されています。それらは習得が難しくなく、辞書検索ロジックに対応できない状況を適切に処理できます 'A' if grade>=90 else 'B' if grade>=80 else 'C' if grade>=70 else 'F'
レイモンドヘッティンガー2012

1
d理解力の外で定義することの利点があるか?
Chris_Rands 2018年

私がリストの理解力を好む理由は、それが英語のように読むからです。プログラマーでない人でも、それが何をするかを理解することができます。このソリューションでは、dict.get()メソッドを理解する必要があります。
Tim Skov Jacobsen、

25

できます。

次のような構文を使用する場合は注意してください。

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

if / else演算子の三項形式を使用しています(Cのような言語に精通している場合、これは?:構文のようになります:)(v == 1 ? 'yes' : 'no')

三項形式のif / else演算子には「elif」が組み込まれていませんが、「else」条件でそれをシミュレートできます。

['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ステートメントでシミュレートできます。


最後の段落コードは非常に洞察に満ちています。
逸脱者


2

リスト内包表記を使用して、オリジナルから別のリストを作成することができます。

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

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

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

あなたに正しい答えを与えます:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.