web-dev-qa-db-ja.com

ifステートメントによるリストの理解

2つのイテラブルを比較し、両方のイテラブルに表示されるアイテムを印刷します。

>>> a = ('q', 'r')
>>> b = ('q')


# Iterate over a. If y not in b, print y.
# I want to see ['r'] printed.
>>> print([ y if y not in b for y in a])
                              ^

ただし、^が配置されている無効な構文エラーが表示されます。このランバ機能の何が問題になっていますか?

87
OrangeTux

注文が間違っています。 ifforの後にある必要があります(if-else三項演算子にある場合を除く)

[y for y in a if y not in b]

ただし、これは機能します。

[y if y not in b else other_value for y in a]
157
Volatility

最後にifを追加します。

[y for y in a if y not in b]

リストの内包表記は、ネストされた完全に指定された対応するものと同じ順序で記述され、基本的に上記のステートメントは次のように変換されます。

outputlist = []
for y in a:
    if y not in b:
        outputlist.append(y)

代わりにバージョンがこれを実行しようとしました:

outputlist = []
if y not in b:
    for y in a:
        outputlist.append(y)

ただし、リストの内包must少なくともone外側のループで開始します。

36
Martijn Pieters

これはラムダ関数ではありません。これはリストの理解です。

順序を変更するだけです:

[ y for y in a if y not in b]
5
eumiro

リスト内包表記式:

[<value_when_condition_true> if <condition> else <value_when_condition_false> for value in list_name]

したがって、次のようにすることができます:

[y for y in a if y not in b]

デモンストレーションのみを目的とする場合:[yがbにない場合はy、aがyの場合はfalse]

5