Python计数器与Bag类型的比较
我需要Python中类似bag/multiset的数据类型。我了解收集。计数器经常用于此目的。但比较运算符似乎不起作用:Python计数器与Bag类型的比较,python,comparison,multiset,python-collections,Python,Comparison,Multiset,Python Collections,我需要Python中类似bag/multiset的数据类型。我了解收集。计数器经常用于此目的。但比较运算符似乎不起作用: In [1]: from collections import Counter In [2]: bag1 = Counter(a=1, b=2, c=3) In [3]: bag2 = Counter(a=2, b=2) In [4]: bag1 > bag2 Out[4]: True 这对我来说似乎是一个错误。我希望小于和大于运算符能够执行类似集合的子集和超集
In [1]: from collections import Counter
In [2]: bag1 = Counter(a=1, b=2, c=3)
In [3]: bag2 = Counter(a=2, b=2)
In [4]: bag1 > bag2
Out[4]: True
这对我来说似乎是一个错误。我希望小于和大于运算符能够执行类似集合的子集和超集比较。但是如果是这样的话,bag1>bag2
将是错误的,因为bag2
包含一个额外的'a'
。计数器对象上似乎也没有子集/超集方法。所以我有两个问题:
在Python2上,比较返回到(
计数器
是dict
的子类)
映射(字典)比较相等当且仅当其排序
(键、值)列表比较相等。[5] 平等以外的结果是平等的
一致解决,但未另行定义。[6]
在Python 3上:
映射(字典)比较相等当且仅当它们具有
相同的(键、值)对。订单比较(“”)
引发类型错误
这一悬而未决的问题令人感兴趣: 如何比较子集、超集、真子集和真超集的计数器对象 通过定义缺少的“富比较方法”,您还可以使用自由函数,这将使客户端代码更显式
from collections import Counter
class PartiallyOrderedCounter(Counter):
def __le__(self, other):
""" Multiset inclusion """
return all( v <= other[k] for k,v in self.items() )
def __lt__(self, other):
""" Multiset strict inclusion """
return self <= other and self != other
# TODO : __ge__ and __gt__
# Beware : they CANNOT be written in terms of __le__ or __lt__
a = PartiallyOrderedCounter('abc')
b = PartiallyOrderedCounter('ab')
c = PartiallyOrderedCounter('abe')
assert a <= a
assert not a < a
assert b <= a
assert b < a
assert not a < b
assert not c <= a
assert not a <= c
从集合导入计数器
类PartiallyOrderedCounter(计数器):
定义(自我、其他):
“多集包含”
全部归还(v)你读过文档吗?是的,如果你指的是这里的文档:他们将其描述为一个bag/multiset,我认为这意味着比较运算符将是有意义的。我以前没有见过链接的问题,我知道它是如何关联的,但它有几个问题:没有描述如何实现适当的子集,尽管我猜 set('abc')>set('ab')
也是True
我是Python2.7,抱歉忘了提一下。另外,这里似乎没有按内存地址进行比较:id(bag1)是4371127560,id(bag2)是4371127856。因此bag2
应该大于bag1
@WilliamReed:您看到的顺序是任意的。它不会返回到默认顺序;它会返回到,因为计数器继承自dict
@WilliamReed:user2357112当然是正确的,但这是一个小小的安慰。它是什么呢这意味着说一本字典比另一本少?在Python 2中,这个问题的答案定义得很好,但在Python 3中被认为是如此无用,以至于被删除。我想知道为什么计数器没有提供这个功能。我可以想到一个应用程序,它会很有用(环肽测序),而且肯定还有其他应用程序。向上投票。。。