python 2.5以降のリスト内包表記でelseのみを使用できると信じるのは正しいですか?
つまり、2.4 で次のことを達成するための最良の方法は何でしょうか?
print [x if x != "3" else "1" + "3" for x in ["1","2","3"]]
python 2.5以降のリスト内包表記でelseのみを使用できると信じるのは正しいですか?
つまり、2.4 で次のことを達成するための最良の方法は何でしょうか?
print [x if x != "3" else "1" + "3" for x in ["1","2","3"]]
条件式はpython 2.5で新しくなったと思います。古い回避策の 1 つは、次を使用することです。
("13",x)[x!=3]
これが行うことは、タプル ( ("1",x)
) を作成し、ブール値 ( True
( 1
) またはFalse
( 0
)) でインデックス付けすることです。
すべてをまとめると、次のようになります。
[("13",x)[x!="3"] for x in ("1","2","3")]
このイディオムは非常に読みにくいので、実際にpython2.4 をサポートする必要があるかどうかを自問する価値があります。もう少し冗長な代替手段は、関数を使用することです。
def conditional_expr(a,cond,b):
if cond:
return a
else:
return b
言い換えると:
[conditional_expr(x,x!='3','13') for x in ("1","2","3")]
もちろん、これらのどれも、短絡できる条件式と実際に比較することはできません (たとえば、条件がTrue
である場合、戻り値が である場合は、戻り値を評価する必要はありませんFalse
) 。
地図が使える…
In [38]: def f(x):
....: if x != "3":
....: return x
....: else:
....: return "1" + "3"
....:
In [39]: map(f, ["1", "2", "3"])
Out[39]: ['1', '2', '13']
「Janne Karila」が提案する別のアプローチ
In [40]: [f(x) for x in ["1", "2", "3"]]
Out[40]: ['1', '2', '13']
2.4 のリスト内包表記については知りません。しかし、どのような場合でも、従来の for ループで十分です。
l = []
for x in ["1","2","3"]:
if x != "3":
l.append(x)
else:
l.append("1" + "3")
print l
完全なfor
ループが必要で、1 つのif
ステートメントのみをテストする必要があります。
results = []
for x in ["1","2","3"]:
if x == "3":
x = "1" + "3"
results.append(x)
python2.4互換の「ワンライナー条件」のいくつかは、読み方が混乱するほど価値がありません(私はそう思います)。