2017-02-23 131 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的廣度相​​同,所以將其解釋爲等效的結構不會是一個好主意。但是它對於某些操作可能非常方便。