1
multiset是一個允許重複的集合。所以一個submultiset是包含更少或相同數量的每個元素的一個。如何檢查包含multisets?
有沒有一種方法來表示和操作Python中的multisets?
設置顯然不適合這個。例如,下面的代碼返回True,這不是我想要的,因爲它將重複的字母作爲一個字母。
{'h','h','h','e','e','e','e'}.issubset({'h', 'e'})
multiset是一個允許重複的集合。所以一個submultiset是包含更少或相同數量的每個元素的一個。如何檢查包含multisets?
有沒有一種方法來表示和操作Python中的multisets?
設置顯然不適合這個。例如,下面的代碼返回True,這不是我想要的,因爲它將重複的字母作爲一個字母。
{'h','h','h','e','e','e','e'}.issubset({'h', 'e'})
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
或者,我們可以驗證的東西,如著名的加法法則,
>>> big | small == big + small - (big & small)
True
值得注意的是,一個Counter
不不有界面有點象C++ std::multiset
的廣度相同,所以將其解釋爲等效的結構不會是一個好主意。但是它對於某些操作可能非常方便。
你是什麼意思,「重複字母作爲一個字母」?你知道一個集合不能包含重複項目? – miradulo
該集合包含兩個元素('h'和'e')。您不能重複集合中的項目,因爲一個集合由唯一元素組成。 IOW,你可以給集合添加'h'十億次,你仍然會得到一個只有一個元素的集合。 –