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'十亿次,你仍然会得到一个只有一个元素的集合。 –