我知道我可以测试set1是否为set2的子集:
{'a','b','c'} <= {'a','b','c','d','e'} # True
但以下也是正确的:
{'a','a','b','c'} <= {'a','b','c','d','e'} # True
如何考虑集合中元素的出现次数,以便:
{'a','b','c'} <= {'a','b','c','d','e'} # True
{'a','a','b','c'} <= {'a','b','c','d','e'} # False since 'a' is in set1 twice but set2 only once
{'a','a','b','c'} <= {'a','a','b','c','d','e'} # True because both sets have two 'a' elements
我知道我可以这样做:
A, B, C = ['a','a','b','c'], ['a','b','c','d','e'], ['a','a','b','c','d','e']
all([A.count(i) == B.count(i) for i in A]) # False
all([A.count(i) == C.count(i) for i in A]) # True
但是我想知道是否有更简洁的事情如set(A).issubset(B,count=True)
或者是一种保持列表理解的方式。谢谢!
答案 0 :(得分:6)
如评论中所述,使用Counter
的可能解决方案:
from collections import Counter
def issubset(X, Y):
return len(Counter(X)-Counter(Y)) == 0
答案 1 :(得分:3)
对您的问题的简短回答是没有设置操作可以执行此操作,因为definition of a set不提供这些操作。定义您正在寻找的功能的IE将使数据类型不是一组。
按定义设置具有唯一的,无序的成员:
>>> print {'a', 'a', 'b', 'c'}
set(['a', 'c', 'b'])
>>> {'a', 'a', 'b', 'c'} == {'a', 'b', 'c'}
True
答案 2 :(得分:1)
结合以前的答案,提供尽可能干净和快速的解决方案:
def issubset(X, Y):
return all(v <= Y[k] for k, v in X.items())
答案 3 :(得分:0)
由于@DSM删除了他的解决方案,我将借此机会提供一个可以扩展的原型
>>> class Multi_set(Counter):
def __le__(self, rhs):
return all(v == rhs[k] for k,v in self.items())
>>> Multi_set(['a','b','c']) <= Multi_set(['a','b','c','d','e'])
True
>>> Multi_set(['a','a','b','c']) <= Multi_set(['a','b','c','d','e'])
False
>>> Multi_set(['a','a','b','c']) <= Multi_set(['a','a','b','c','d','e'])
True
>>>
答案 4 :(得分:0)
对于那些对多集包含的通常概念感兴趣的人,测试多集包含的最简单方法是使用多集的交集:
from collections import Counter
def issubset(X, Y):
return X & Y == X
issubset(Counter("ab"), Counter("aab")) # returns True
issubset(Counter("abc"), Counter("aab")) # returns False
这是idempotent semirings中使用的标准概念。