2017-02-23 134 views
1

multiset是一个允许重复的集合。所以一个submultiset是包含更少或相同数量的每个元素的一个。如何检查包含multisets?

有没有一种方法来表示和操作Python中的multisets?

设置显然不适合这个。例如,下面的代码返回True,这不是我想要的,因为它将重复的字母作为一个字母。

{'h','h','h','e','e','e','e'}.issubset({'h', 'e'}) 
+3

你是什么意思,“重复字母作为一个字母”?你知道一个集合不能包含重复项目? – miradulo

+0

该集合包含两个元素('h'和'e')。您不能重复集合中的项目,因为一个集合由唯一元素组成。 IOW,你可以给集合添加'h'十亿次,你仍然会得到一个只有一个元素的集合。 –

回答

2

Python中multiset我知道最简单的表示是collections.Counter对象。它支持基本的设置操作(+,-,&,|),虽然它没有像issubset这样的方法,但你可以用更简单的操作来模拟这些操作。

例如,

>>> from collections import Counter 
>>> big = Counter(list('hhheeee')) 
>>> small = Counter(list('he')) 
>>> big 
Counter({'e': 4, 'h': 3}) 

要检查我们的反“多集” Counter({'e': 4, 'h': 3})是多重集Counter({'e': 1, 'h': 1})的一个子集,

>>> not bool(big-small) 
False 

或者,我们可以验证的东西,如著名的加法法则,

enter image description here

>>> big | small == big + small - (big & small) 
True 

值得注意的是,一个Counter有界面有点象C++ std::multiset的广度相​​同,所以将其解释为等效的结构不会是一个好主意。但是它对于某些操作可能非常方便。