我发现,关于如何查找列表中是否存在至少一个项目存在相关问题:
How to check if one of the following items is 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
但在这里你必须做更多的打字。
还有其他解决方案吗?
答案 0 :(得分:108)
Python中的<=
等运算符通常不会覆盖与“小于或等于”明显不同的含义。标准库执行此操作是不寻常的 - 它对我来说闻起来像传统的API。
使用等效且名称更清晰的方法set.issubset
。请注意,您不需要将参数转换为集合;如果需要,它会为你做的。
set(['a', 'b']).issubset(['a', 'b', 'c'])
答案 1 :(得分:59)
我可能会以下列方式使用set
:
set(l).issuperset(set(['a','b']))
或反过来说:
set(['a','b']).issubset(set(l))
我发现它更具可读性,但可能会过度杀戮。集合对于计算集合之间的并集/交集/差异特别有用,但在这种情况下它可能不是最佳选择......
答案 2 :(得分:9)
我喜欢这两个,因为它们看起来最合乎逻辑,后者更短,可能更快(这里使用set
文字语法显示,这对Python 2.7来说是backported:
all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
# or
{'a', 'b'}.issubset({'a', 'b', 'c'})
答案 3 :(得分:1)
如果您的列表包含以下重复项,该怎么办:
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)
答案 4 :(得分:0)
这是我在网上搜索的内容,但不幸的是,我在尝试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
>>>
>>>
答案 5 :(得分:0)
如何使用lambda表达式执行此操作的示例为:
issublist = lambda x, y: 0 in [_ in x for _ in y]
答案 6 :(得分:0)
不是OP的情况,但是-对于任何想要在 dict 中声明交集并由于不良谷歌搜索而最终到达此处的人(例如我)-您需要与dict.items
合作:< / p>
>>> 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中的任何对象一样,它们具有可互换的可比性