python集合中的对象相等性。计数器

python集合中的对象相等性。计数器,python,dictionary,counter,object-equality,Python,Dictionary,Counter,Object Equality,我有collections.Counter类的和实例,还有一些对象,如: p1 = Person(name='John') p2 = Person(name='John') p3 = Person(name='Jane') 我希望在计数器实例中保留此person对象的计数,考虑到同名person对象必须增加相同的person计数,因此如果我有一个包含所有person对象的列表: people = [p1, p2, p3] 我用它填充我的计数器: c = Counter(people) 我想

我有collections.Counter类的和实例,还有一些对象,如:

p1 = Person(name='John')
p2 = Person(name='John')
p3 = Person(name='Jane')
我希望在计数器实例中保留此person对象的计数,考虑到同名person对象必须增加相同的person计数,因此如果我有一个包含所有person对象的列表:

people = [p1, p2, p3]
我用它填充我的计数器:

c = Counter(people)
我想得到以下信息:

c[p1] #prints 2
c[p2] #prints 2
c[p3] #prints 1
我的第一次尝试是为person对象实现一个新的
\uuuuueq\uuu
方法

def __eq__(self, other):
  return self.name == other.name
我认为这可能会起作用,因为计数器对象似乎会增加计数 对于基于关键点对象相等的关键点,如:

c = Counter(['A', 'A', 'B'])
c['A'] #prints 2
c['B'] #prints 1
另一个尝试可以是从计数器继承并重写 计数器用于测量对象之间的相等性,我不确定,但我认为 计数器使用
\uuuu contains\uuuu
方法进行此操作


我的问题是,是否有任何方法可以在不使用继承的情况下获得此行为,如果没有,那么最好的方法是什么

class Person(object):
    def __init__(self, name=None, address=None):
        self.name = name
        self.address = address

    def __eq__(self, other):
        return self.name == other.name and self.address == other.address

    def __hash__(self):
        return hash((self.name, self.address))
现在,您的代码可以工作了:

>>> Counter(people)
Counter({<__main__.Person object at 0x24a7590>: 2, <__main__.Person object at 0x24a75d0>: 1})
>计数器(人员)
计数器({:2,:1})

如果您的对象像示例中那样简单,请使用
集合。命名耦合

from collections import Counter, namedtuple
Person = namedtuple('Person','name')

n1 = Person(name='John')
n2 = Person(name='John')
n3 = Person(name='Jane')
Counter((n1,n2,n3))
# Counter({Person(name='John'): 2, Person(name='Jane'): 1})