Python计数器与Bag类型的比较

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 这对我来说似乎是一个错误。我希望小于和大于运算符能够执行类似集合的子集和超集

我需要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
这对我来说似乎是一个错误。我希望小于和大于运算符能够执行类似集合的子集和超集比较。但是如果是这样的话,
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中被认为是如此无用,以至于被删除。我想知道为什么计数器没有提供这个功能。我可以想到一个应用程序,它会很有用(环肽测序),而且肯定还有其他应用程序。向上投票。。。