我认为这很容易找到,但没有运气。基本上如果我有两个列表,我想测试一个列表是另一个列表:
list1 = ['car', 'cart', 'dog']
list2 = ['car', 'dog']
list1 == list 2
应为True
,因为list2
是list1
的子集。我的解决方案太复杂了。我的问题是 - 用列表做一个简单的函数吗?更重要的是,要测试子集,列出即使是正确的方法,还是有更好的数据结构,我应该研究解决这个问题。试图实现我自己的apriori算法版本。提前谢谢了。
答案 0 :(得分:3)
将list2
转换为set
并使用issubset
方法:
In [48]: list1 = ['car', 'cart', 'dog']
In [49]: list2 = ['car', 'dog']
In [50]: set(list2).issubset(list1)
Out[50]: True
答案 1 :(得分:2)
你想要一个multiset。
>>> from multiset import Multiset # pip install multiset
>>> Multiset(['car', 'dog']) <= Multiset(['car', 'cart', 'dog'])
True
>>> Multiset(['car', 'dog', 'dog']) <= Multiset(['car', 'cart', 'dog'])
False
collections.Counter
是标准库multiset,但它缺少子集运算符<=
,所以如果你想坚持使用标准库,你必须自己编写循环而不是使用set操作。 / p>
>>> from collections import Counter
>>> counter1 = Counter(['car', 'dog'])
>>> counter2 = Counter(['car', 'cart', 'dog'])
>>> all(counter1[k] <= counter2[k] for k in counter1)
True
答案 2 :(得分:2)
使用列表不仅表明您对成员的存在以及他们的订单感兴趣。如果订单不重要,你应该选择一套。
另一方面,您必须考虑到您不能在列表中拥有相同成员的副本。也许是你的第三种数据结构。
对于我来说,问题最大的不确定性归结为&#39;是否是子集&#39;问题考虑了顺序,可能还有重复的条目如何处理。
你能详细说明吗?答案 3 :(得分:1)
如果迭代中传递的所有元素都是True
,则可以使用返回True
的{{3}}函数。因此,在我们的示例中,我们可以使用generator-comprehension
来生成布尔值,以确定list2
中的每个值是否都在list1
中:
>>> all(i in list1 for i in list2)
True
答案 4 :(得分:0)
以下解决方案假设您的输入列表包含唯一元素。
例如,使用list1 = ['a', 'b']
和list2 = ['a', 'a']
无效。
list1 = ['car', 'cart', 'dog']
list2 = ['car', 'dog']
set(list2) <= set(list1) # True
如果你想检查它是否是正确的子集,换句话说两个列表不能相同,你可以使用它:
set(list2) < set(list1) # True