web-dev-qa-db-ja.com

次の項目がすべてリストに含まれているかどうかを確認するにはどうすればよいですか?

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

ただし、ここでは、さらに入力する必要があります。

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

95
sirex

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

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

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

おそらく set を次のように使用します。

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

またはその逆:

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

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

60
tsimbalar

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

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

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

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)
2
Brut

これは私がオンラインで検索していたものでしたが、残念ながらオンラインではなく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
Emirhan Özlen

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

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