Joe*_*lip 4 python set subset multiplicity multiset
我知道我可以测试set1是否是set2的子集:
{'a','b','c'} <= {'a','b','c','d','e'} # True
Run Code Online (Sandbox Code Playgroud)
但以下也是正确的:
{'a','a','b','c'} <= {'a','b','c','d','e'} # True
Run Code Online (Sandbox Code Playgroud)
我如何考虑集合中元素的出现次数,以便:
{'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
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
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
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有一些更简洁的东西set(A).issubset(B,count=True)
或一种方法来保持列表理解.谢谢!
如评论中所述,可能的解决方案使用Counter
:
from collections import Counter
def issubset(X, Y):
return len(Counter(X)-Counter(Y)) == 0
Run Code Online (Sandbox Code Playgroud)
由于@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
>>>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4828 次 |
最近记录: |