web-dev-qa-db-ja.com

リスト内に他のものがあれば

リストlがあります。

l = [22, 13, 45, 50, 98, 69, 43, 44, 1]

45以上の数字の場合は、1を加えます。それ以下の数の場合は5。

私は試した

[x+1 for x in l if x >= 45 else x+5]

しかし、それは私に構文エラーを与えます。リスト内包でこのようなif - elseを実現するにはどうすればよいですか?

337
user225312
>>> l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
>>> [x+1 if x >= 45 else x+5 for x in l]
[27, 18, 46, 51, 99, 70, 48, 49, 6]

<condition>の場合は何か、それ以外の場合は何かをします。

392
user225312

このエラーが発生する理由は、リスト内包表記の実行方法に関係しています。

次の点に注意してください。

[ expression for item in list if conditional ]

と同等です:

for item in list:
    if conditional:
        expression

expressionの形式が若干異なる場合(文中で主語と動詞の順序を入れ替えると思います).

したがって、あなたのコード[x+1 for x in l if x >= 45]はこれを行います:

for x in l:
    if x >= 45:
        x+1

しかし、このコード[x+1 if x >= 45 else x+5 for x in l]はこれを行います(expressionを再配置した後)。

for x in l:
    if x>=45: x+1
    else: x+5
203
arboc7
[x+1 if x >= 45 else x+5 for x in l]

そして報酬のために、ここにコメントがあります、私はこのエラーを最初にしたときにこれを覚えていると書きました:

Pythonの条件式はa if C else bであり、次のようには使用できません。

[a for i in items if C else b]

正しい形式は次のとおりです。

[a if C else b for i in items]

有効な形式がありますが:

[a for i in items if C]

しかし、それはCによるフィルタリング方法と同じではありませんが、組み合わせることができます。

[a if tC else b for i in items if fC]
174
Dan D.

あなたは式をリスト内包表記の始めに置かなければなりません。

[x+1 if x >= 45 else x+5 for x in l]
91
AndiDog

リスト内包の内側に条件式を大括弧で囲むこともできます。

    l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
    print [[x+5,x+1][x >= 45] for x in l]

[false、true] [condition]は構文です

15

[a if condition1 else b for i in list1 if condition2]のように、condition1condition2を持つ2つのifは2つの異なることをします。 (a if condition1 else b)の部分はラムダ式からのものです。

lambda x: a if condition1 else b

もう一方のcondition2は別のラムダです。

lambda x: condition2

リスト全体の理解はmapfilterの組み合わせと見なすことができます。

map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))
14
Xiaojun Chen

私はちょうど同じような問題を抱えていました、そしてこの質問と答えは本当に役に立ちました。これは私が混乱した部分です。私はそれを明示的に書いています。なぜなら、実際には英語でそれを単純に述べていないからです。

繰り返しは最後に行きます。

通常、ループは行きます

for this many times:
    if conditional: 
        do this thing
    else:
        do something else  

最初の答えがしたように、誰もがリスト内包部分を単純に述べます、

[ expression for item in list if conditional ] 

しかし、それは実際にはこの場合あなたがすることではありません。 (私はそうしようとしていた)

この場合、それはよりこのようなものです:

[ expression if conditional else other thing for this many times ] 
8
szeitlin

次のように条件を移動することができます。

v = [22, 13, 45, 50, 98, 69, 43, 44, 1]
[ (x+1 if x >=45 else x+5)  for x in v ]

しかし、それは少し醜く見え始めているので、あなたは通常のループを使うほうがよいかもしれません。 1という数字との混同を減らすために、リスト変数にvの代わりにlを使用したことに注意してください(lOは、どんな場合でも、変数名として避けるべきだと思います)。

6
Jeet