ifステートメントで理解をリスト


106

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])
                              ^

しかし、それ^が配置されている場所に無効な構文エラーが表示されます。このランバ関数の何が問題になっていますか?


5
以下のすべての答えは正しいですがb = ('q')、タプルも作成されません。1つの要素を持つタプルには明示的な,、つまりb = ('q',)
dmg

に変わりtuplesましたiterables
OrangeTux 2013年

回答:


187

注文が間違っています。if後にあるべきであるfor(それがでない限り、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]

ありがとう。私はラムダ関数のif elseステートメントに関するこのポストstackoverflow.com/questions/4406389/…を見ました。そして、ifステートメントのみ(elseなし)を使用しても同じ順序で機能すると考えました。
OrangeTux 2013年

39

あなた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)

ただし、リスト内包表記、少なくとも1つの外部ループで始まる必要があります。


あなたはとても役に立ちました。ありがとうございました。
TolgahanÜZÜN2017

7

リスト内包表記:

[<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にない場合]


2
elseリスト内包表記には、少なくとも1つの内包表記を含めることはできません。リスト内包表記(フィルタリング)と条件式(値が必要で、else式を必須にする)を混同しないでください。
Martijn Pieters

同意します。elseコードに示すように、リスト内包表記で使用できます。
Vishvajit Pathak 2017

2
これは条件式です。有効な式が適用できる場所ならどこでも使用できます。内包表記の一覧は特にありません。
Martijn Pieters

5

これはラムダ関数ではありません。リスト内包です。

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

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

-2

私は以下のように私の状況に対する上記のリスト理解の提案を調査して試しましたが、うまくいきませんでした。ここで何が悪いのですか?

sent_splt=[['good', 'case,', 'excellent', 'value.'], ['great', 'for', 'the', 'jawbone.'],['tied', 'to', 'charger', 'for', 'conversations', 'lasting', 'more', 'than', '45', 'minutes.major', 'problems!!']]

stop_set = ['the', 'a', 'an', 'i', 'he', 'she', 'they', 'to', 'of', 'it', 'from']

x=[a for a in sent_splt if a not in stop_set]
print(x)

単語をフィルタリングするものではありません。


1
あなたがする必要があるのは質問をすることです。回答を投稿しません。
ワールマインド

実は、私にとっては最後の2日から1日休憩後に質問を投稿するということです。Stackoverflowの標準に従っていない私の前の質問のため、基本的に私は質問を投稿することはできません。ご不便をおかけして申し訳ありません。
Deepak Dhiman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.