我发现,有一个相关的问题,关于如何找到,如果至少有一个项目存在于一个列表:
How to check if one of the following items is in a list?
但是,什么是最好的和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
但是在这里你必须多打字。
有没有其他的解决办法?
8条答案
按热度按时间lqfhib0f1#
像Python中的
<=
这样的运算符通常不会被覆盖,表示与“未来或等于”有很大不同的含义。标准库这样做是不寻常的--我觉得它有点像遗留API。使用等效的、名称更清楚的方法
set.issubset
。注意,不需要将参数转换为集合;如果需要的话它会帮你的。sycxhyv72#
我可能会按以下方式使用
set
:或者反过来说:
我发现它更容易阅读,但是可能有点过头了。集合对于计算集合之间的并集/交集/差特别有用,但是在这种情况下它可能不是最好的选择...
omvjsjqw3#
我喜欢这两个,因为它们看起来最符合逻辑,后者更短,而且可能更快(这里使用的是
set
字面语法,它已经被移植到Python 2.7):hsgswve44#
如果您的列表中包含重复项,该怎么办:
集合不包含重复项。因此,下面的行返回True。
要计算重复项,可以使用以下代码:
因此,下面的行返回False。
mkh04yzy5#
OP的情况不是这样,但是--对于任何想要Assert交集in dicts 并由于糟糕的谷歌搜索而最终到达这里的人(例如我)--您需要使用
dict.items
:这是因为
dict.items
返回键/值对的元组,就像Python中的任何对象一样,它们可以互换tvokkenx6#
另一种解决办法是:
我的解决方案之所以出色,是因为您可以通过内联列表来编写一行程序。
nhhxz33t7#
使用lambda表达式执行此操作的示例如下:
fzsnzjdm8#
短语法
我在试验Python解释器时发现了一种可读性很强的语法。
要搜索的项目列表
如果要搜索的对象列表很长,保存在
sub_list
变量中:如果超集中包含任何(至少一个)项(
or
语句):如果所有的元素都包含在超集中(
and
语句),那么sub_list
就是一个完整的子集。