2

python 2.5以降のリスト内包表記でelseのみを使用できると信じるのは正しいですか?

つまり、2.4 で次のことを達成するための最良の方法は何でしょうか?

print [x if x != "3" else "1" + "3" for x in ["1","2","3"]]
4

4 に答える 4

2

条件式は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) 。

于 2012-11-29T07:08:25.037 に答える
1

地図が使える…

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']
于 2012-11-29T07:17:07.427 に答える
1

2.4 のリスト内包表記については知りません。しかし、どのような場合でも、従来の for ループで十分です。

l = []
for x in ["1","2","3"]:
    if x != "3":
        l.append(x)
    else:
        l.append("1" + "3")
print l
于 2012-11-29T07:08:51.173 に答える
0

完全なforループが必要で、1 つのifステートメントのみをテストする必要があります。

results = []
for x in ["1","2","3"]:
    if x == "3":
        x = "1" + "3"
    results.append(x)

python2.4互換の「ワンライナー条件」のいくつかは、読み方が混乱するほど価値がありません(私はそう思います)。

于 2012-11-29T07:10:00.027 に答える