web-dev-qa-db-ja.com

一行のリスト内包表記:if-elseの異形

それはpythonのリスト内包構文に関するものです。与えられた範囲の奇数のリストを生成するリスト内包表記があります。

[x for x in range(1, 10) if x % 2]

これはフィルタを作る - 偶数を削除するソースリストを持っている(if x % 2)。ここではif-then-elseのようなものを使いたいのですが。次のコードは失敗します。

>>> [x for x in range(1, 10) if x % 2 else x * 100]
  File "<stdin>", line 1
    [x for x in range(1, 10) if x % 2 else x * 100]
                                         ^
SyntaxError: invalid syntax

If-elseのようなpython式があります。

1 if 0 is 0 else 3

リスト内包内でそれを使用する方法?

136
ducin

x if y else zは、各要素に対して返す式の構文です。したがって、あなたは必要です:

[ x if x%2 else x*100 for x in range(1, 10) ]

最初の例ではフィルタを使用していますが、2番目の例では使用していないため、混乱が生じます。 2番目の例では、三項演算子式を使用して、それぞれの値を別の値にマッピングしているだけです。

フィルタを使用すると、次のものが必要になります。

[ EXP for x in seq if COND ]

フィルターなしであなたは必要とします:

[ EXP for x in seq ]

そしてあなたの2番目の例では、式は "複雑な"式で、if-elseを含みます。

268
shx2
[x if x % 2 else x * 100 for x in range(1, 10) ]
21
lucasg

もう1つの解決策は、誰かがそれを好むことを願っています:

使用方法:[False、True] [式]

>>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>
10
James Sapam

あなたはリスト内包表記でもそれをすることができます:

    A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
    print A
10

これができました

>>> [x if x % 2 != 0 else x * 100 for x in range(1,10)]
    [1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>
2
anudeep