簡體   English   中英

如何檢查以下所有項目是否都在列表中?

[英]How to check if all of the following items are in a list?

我發現,有一個相關的問題,關於如何查找列表中是否至少存在一個項目:
如何檢查以下項目之一是否在列表中?

但是,查找列表中是否存在所有項目的最佳 Pythonic 方法是什么?

搜索文檔我找到了這個解決方案:

>>> 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

但在這里你必須多打字。

還有其他解決方案嗎?

Python 中的<=等運算符通常不會被覆蓋以表示與“小於或等於”顯着不同的含義。 標准庫這樣做很不尋常——對我來說,它聞起來像是遺留 API。

使用等效且名稱更明確的方法set.issubset 請注意,您不需要將參數轉換為集合; 如果需要,它會為您做到這一點。

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

我可能會以下列方式使用set

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

或者反過來:

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

我發現它更具可讀性,但它可能會過度殺傷。 集合對於計算集合之間的並集/交集/差異特別有用,但在這種情況下它可能不是最佳選擇......

我喜歡這兩個,因為它們看起來最合乎邏輯,后者更短並且可能最快(此處使用已向后移植到 Python 2.7 的set文字語法顯示):

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

如果您的列表包含這樣的重復項怎么辦:

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)

這就是我在網上搜索的內容。 不過很遺憾沒有在網上找到,而是在嘗試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
>>>
>>>

如何使用 lambda 表達式執行此操作的示例如下:

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

不是 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 中的任何對象一樣,它們可以互換比較

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM