次のすべてのアイテムがリストにあるかどうかを確認するにはどうすればよいですか?


113

リストに少なくとも1つのアイテムが存在するかどうかを確認する方法について、関連する質問があることがわかりました。次のアイテムのいずれかがリストにある
かどうかを確認する方法は?

しかし、すべてのアイテムがリストに存在するかどうかを見つけるための最適でPython的な方法は何ですか?

ドキュメントを検索すると、この解決策が見つかりました:

>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False

他の解決策はこれでしょう:

>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False

しかし、ここではさらにタイピングを行う必要があります。

他の解決策はありますか?


5
何が問題になっていset(smaller) <= set(larger)ますか?
eumiro

1
'all'を使用した2番目のソリューションは、見た目がよく、Pythonicに見えると思います。
能地法

回答:


156

<=Pythonのような演算子は一般に、「以下」と大幅に異なるものを意味するようにオーバーライドされていません。標準ライブラリがこれを行うのは珍しいことです-それはレガシーAPIのようなにおいがします。

同等の、より明確な名前のメソッドを使用してくださいset.issubset。引数をセットに変換する必要がないことに注意してください。必要に応じてそれを行います。

set(['a', 'b']).issubset(['a', 'b', 'c'])

2
issubsetへの引数としてリストを直接渡すことができることを知りませんでした... nice!
tsimbalar 2010年

1
私はその感情に同意しますが、同じことの概念<=issubset意味については大丈夫です。なんで嫌いなの?
Kirk Strauser

2
@Just:主<=に、ドキュメントで調べたり、セット理論でそれが何をissubset意味するかについて事前に知識を持たなかったりしないと、セットの意味が明確ではないため、誰もが自動的に意味を知っています。
Glenn Maynard

2
(適切でない)サブセットの数学演算子を知っていますか?それは基本的に丸められた<=;)のように見えます
dom0

このソリューションが大好きです。bool(True:False)の代わりにインデックスの場所またはリストの値を取得する方法はありますか?
Vlad Gulin

62

私はおそらくset次のように使用します:

set(l).issuperset(set(['a','b'])) 

またはその逆:

set(['a','b']).issubset(set(l)) 

もう少し読みやすいと思いますが、やり過ぎかもしれません。セットは、コレクション間の和集合/交差/差を計算するのに特に役立ちますが、この状況では最適なオプションではない場合があります...


実際に、MySet.issubset(MyOtherSet)そしてMySet <= MyOtherSet同じです。
2010年

1
@wok:ああ、私はそれを知りませんでしたが、同様の構文をリストで使用できるので、<=構文は少しわかりにくいと思いますが、意味が大きく異なります。
tsimbalar

3
包含がセットのセットの部分的な順序を定義していることを思い出しても、それほど混乱することはありません。<=シーケンスに対して意味があるのは実際には少し混乱しています。辞書順ではなく、「サブシーケンスである」ことを意味すると期待できます。
aaronasterling

1
@aaronasterling:うーん、個人的にはコードを入力するときに「半順序」についてあまり考えません:-) <=でも、シーケンスでの使用も奇妙に感じられるという事実に同意します...
tsimbalar

3
私は、私が言及したいのですが、ここで少し落とし穴に走った:あなたは、このメソッドを使用する場合は、している何の重複がないことを意味しており、セットにあなたのリストを変換します。set(['a','a']).issubset(['a'])を返しますTrue
Orangestar 2015

11

私はこれら2つが最も論理的で、後者がおそらく最も高速であるように見えるので、気に入っsetています(ここでは、Python 2.7にバックポートされたリテラル構文を使用して示しています )。

all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
#   or
{'a', 'b'}.issubset({'a', 'b', 'c'})

「すべて」のソリューションは、timeit()を使用して測定するときに最も速くなります。これは受け入れられる答えになるはずです。
Attersson、

3

リストに次のような重複が含まれている場合:

v1 = ['s', 'h', 'e', 'e', 'p']
v2 = ['s', 's', 'h']

セットには重複は含まれません。したがって、次の行はTrueを返します。

set(v2).issubset(v1)

重複をカウントするには、次のコードを使用できます。

v1 = sorted(v1)
v2 = sorted(v2)


def is_subseq(v2, v1):
    """Check whether v2 is a subsequence of v1."""
    it = iter(v1)
    return all(c in it for c in v2) 

したがって、次の行はFalseを返します。

is_subseq(v2, v1)

1

これは私がオンラインで検索していたものでしたが、残念ながらオンラインではなく、Pythonインタープリターの実験中に見つかりました。

>>> case  = "caseCamel"
>>> label = "Case Camel"
>>> list  = ["apple", "banana"]
>>>
>>> (case or label) in list
False
>>> list = ["apple", "caseCamel"]
>>> (case or label) in list
True
>>> (case and label) in list
False
>>> list = ["case", "caseCamel", "Case Camel"]
>>> (case and label) in list
True
>>>

そして、あなたが保持されている変数のルースリストがある場合 sublist variable

>>>
>>> list  = ["case", "caseCamel", "Case Camel"]
>>> label = "Case Camel"
>>> case  = "caseCamel"
>>>
>>> sublist = ["unique banana", "very unique banana"]
>>>
>>> # example for if any (at least one) item contained in superset (or statement)
...
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
False
>>>
>>> sublist[0] = label
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>> # example for whether a subset (all items) contained in superset (and statement)
...
>>> # a bit of demorgan's law
...
>>> next((False for item in sublist if item not in list), True)
False
>>>
>>> sublist[1] = case
>>>
>>> next((False for item in sublist if item not in list), True)
True
>>>
>>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
True
>>>
>>>

0

ラムダ式を使用してこれを行う方法の例は次のとおりです。

issublist = lambda x, y: 0 in [_ in x for _ in y]

1
回答を説明/詳しく説明するコメントを追加してください
Sharad

0

OPの場合ではありませんが、dicts で交差を主張したいが、グーグルがうまくいかなかったためにここで終わった人(たとえば、私)は、以下を使用する必要がありますdict.items

>>> a = {'key': 'value'}
>>> b = {'key': 'value', 'extra_key': 'extra_value'}
>>> all(item in a.items() for item in b.items())
True
>>> all(item in b.items() for item in a.items())
False

これdict.itemsは、キーと値のペアのタプルを返すためであり、Pythonの任意のオブジェクトと同様に、それらは互換的に互換性があります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.