Python 使计数器考虑同一类的两个对象相同

Python 使计数器考虑同一类的两个对象相同,python,data-structures,collections,Python,Data Structures,Collections,我正在使用collections.Counter。到目前为止,它非常棒,只是我希望它能够将同一类的对象计数为同一个类。我该怎么做?我尝试重写类上的散列()方法,以便所有实例都将散列相同的内容。现在,如果我使用计数器([Type1(),Type1(),Type2(),Type2()])它将返回{:1,:1,:1}我希望它返回类似{“Type1”:2,“Type2”:2}的内容。这可能吗?我在翻文件,不知道如何使它工作 我应该补充一点,我使用的类本质上是常量值的包装器。在类中封装它们更方便。在任何情

我正在使用collections.Counter。到目前为止,它非常棒,只是我希望它能够将同一类的对象计数为同一个类。我该怎么做?我尝试重写类上的散列()方法,以便所有实例都将散列相同的内容。现在,如果我使用
计数器([Type1(),Type1(),Type2(),Type2()])
它将返回
{:1,:1,:1}
我希望它返回类似
{“Type1”:2,“Type2”:2}
的内容。这可能吗?我在翻文件,不知道如何使它工作

我应该补充一点,我使用的类本质上是常量值的包装器。在类中封装它们更方便。在任何情况下,一个Type1对象都不会与另一个Type1对象有所不同。

这个怎么样

Counter(type(x) for x in [Type1(), Type1(), Type2(), Type2()])
以下是您将如何使用它:

>>> type_counter = Counter(type(x) for x in [Type1(), Type1(), Type2(), Type2()])
>>> type_counter
Counter({<class '__main__.Type2'>: 2, <class '__main__.Type1'>: 2})
>>> type_counter[Type1]
2
>>> type_counter[type(Type2())]
2
>>type_counter=计数器(在[Type1(),Type1(),Type2(),Type2()]中为x键入(x)
>>>型计数器
计数器({:2,:2})
>>>类型计数器[类型1]
2.
>>>类型\计数器[类型(类型2())]
2.
这个怎么样

Counter(type(x) for x in [Type1(), Type1(), Type2(), Type2()])
以下是您将如何使用它:

>>> type_counter = Counter(type(x) for x in [Type1(), Type1(), Type2(), Type2()])
>>> type_counter
Counter({<class '__main__.Type2'>: 2, <class '__main__.Type1'>: 2})
>>> type_counter[Type1]
2
>>> type_counter[type(Type2())]
2
>>type_counter=计数器(在[Type1(),Type1(),Type2(),Type2()]中为x键入(x)
>>>型计数器
计数器({:2,:2})
>>>类型计数器[类型1]
2.
>>>类型\计数器[类型(类型2())]
2.

如果要按类名对它们进行分组,可以使用
\uuuu name\uuuu
属性:

Counter(i.__name__ for i in (Type1(), Type2(), Type1()))
或:


如果要按类名对它们进行分组,可以使用
\uuu name\uu
属性:

Counter(i.__name__ for i in (Type1(), Type2(), Type1()))
或:


在再次阅读您的问题之后,我将添加一种可能更适合您需要的不同方法

计数器是一个字典,Python中的字典使用
\uuuuuuuuuuuuuuuuuuuuuuuuuu散列
方法和
\uuuuuuuuuuuueq
方法来比较对象。因此,如果希望对象之间的比较总是相等的,并且可以用作字典键,则需要定义这两种方法

# (Python 3)
class Type1:
    def __eq__(self, other):
        if isinstance(other, Type1):
            return True
        return super().__eq__(other)

    def __hash__(self):
        return 1329916036    # anything constant
如果对
Type2
执行相同的操作,则可以在
计数器中对实例进行计数,如下所示:

>>> mycounter = Counter([Type1(), Type1(), Type2(), Type2()])
>>> mycounter
Counter({<__main__.Type1 object at ...>: 2, <__main__.Type2 object at ...>: 2})
>>> mycounter[Type1()]
2
mycounter=计数器([Type1(),Type1(),Type2(),Type2()]) >>>我的计数器 计数器({:2,:2}) >>>mycounter[Type1()] 2.
再次阅读您的问题后,我将添加一种可能更适合您需要的不同方法

计数器是一个字典,Python中的字典使用
\uuuuuuuuuuuuuuuuuuuuuuuuuu散列
方法和
\uuuuuuuuuuuueq
方法来比较对象。因此,如果希望对象之间的比较总是相等的,并且可以用作字典键,则需要定义这两种方法

# (Python 3)
class Type1:
    def __eq__(self, other):
        if isinstance(other, Type1):
            return True
        return super().__eq__(other)

    def __hash__(self):
        return 1329916036    # anything constant
如果对
Type2
执行相同的操作,则可以在
计数器中对实例进行计数,如下所示:

>>> mycounter = Counter([Type1(), Type1(), Type2(), Type2()])
>>> mycounter
Counter({<__main__.Type1 object at ...>: 2, <__main__.Type2 object at ...>: 2})
>>> mycounter[Type1()]
2
mycounter=计数器([Type1(),Type1(),Type2(),Type2()]) >>>我的计数器 计数器({:2,:2}) >>>mycounter[Type1()] 2.
这是最好的方法。类可以用作字典键!这是最好的办法。类可以用作字典键!啊,情商,这就是我错过的。非常感谢。事实上,我认为你建议的方法更适合我的特殊情况,尽管这正是我所要求的!啊,情商,这就是我错过的。非常感谢。事实上,我认为你建议的方法更适合我的特殊情况,尽管这正是我所要求的!