リスト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
を実現するにはどうすればよいですか?
>>> 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>
の場合は何か、それ以外の場合は何かをします。
このエラーが発生する理由は、リスト内包表記の実行方法に関係しています。
次の点に注意してください。
[ 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
[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]
あなたは式をリスト内包表記の始めに置かなければなりません。
[x+1 if x >= 45 else x+5 for x in l]
リスト内包の内側に条件式を大括弧で囲むこともできます。
l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
print [[x+5,x+1][x >= 45] for x in l]
[false、true] [condition]は構文です
[a if condition1 else b for i in list1 if condition2]
のように、condition1
とcondition2
を持つ2つのif
は2つの異なることをします。 (a if condition1 else b)
の部分はラムダ式からのものです。
lambda x: a if condition1 else b
もう一方のcondition2
は別のラムダです。
lambda x: condition2
リスト全体の理解はmap
とfilter
の組み合わせと見なすことができます。
map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))
私はちょうど同じような問題を抱えていました、そしてこの質問と答えは本当に役に立ちました。これは私が混乱した部分です。私はそれを明示的に書いています。なぜなら、実際には英語でそれを単純に述べていないからです。
繰り返しは最後に行きます。
通常、ループは行きます
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 ]
次のように条件を移動することができます。
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
を使用したことに注意してください(l
とO
は、どんな場合でも、変数名として避けるべきだと思います)。