152

リストに少なくとも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

しかし、ここではもっとタイピングをしなければなりません。

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

4

8 に答える 8

235

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

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

set(['a', 'b']).issubset(['a', 'b', 'c'])
于 2010-10-14T09:05:34.290 に答える
68

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

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

またはその逆:

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

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

于 2010-10-14T08:58:09.497 に答える
19

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

all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
#   or
{'a', 'b'}.issubset({'a', 'b', 'c'})
于 2010-10-14T11:01:21.753 に答える
12

リストに次のような重複が含まれている場合はどうなりますか。

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)
于 2017-08-05T07:44:19.930 に答える
2

これは私がオンラインで探していたものでした。しかし、残念ながらオンラインでは見つかりませんでしたが、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
>>>
>>>
于 2019-01-29T06:26:51.837 に答える
1

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

issublist = lambda x, y: 0 in [_ in x for _ in y]
于 2019-01-29T15:49:07.800 に答える
1

OPの場合ではありませんが、ディクテーション で交差を表明したいが、グーグルが不十分なためにここに到達した場合(たとえば、私)は、次のように作業する必要があります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の他のオブジェクトと同様に、互換性があるためです。

于 2020-04-16T20:22:47.357 に答える
1

別の解決策は次のとおりです。

l = ['a', 'b', 'c']
potential_subset1 = ['a', 'b']
potential_subset2 = ['a', 'x']
print(False not in [i in l for i in potential_subset1]) # True
print(False not in [i in l for i in potential_subset2]) # False

私のソリューションを素晴らしいものにしているのは、リストをインラインに配置することでワンライナーを作成できることです。

于 2021-09-23T07:54:21.317 に答える