将对象添加到python的集合中并通过对象的属性确定

add object into python#39;s set collection and determine by object#39;s attribute(将对象添加到python的集合中并通过对象的属性确定)
本文介绍了将对象添加到python的集合中并通过对象的属性确定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个像这样的 Person 类:

I have a Person class like this:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return '<Person {}>'.format(self.name)

我想将此类的一些实例添加到集合中,如下所示:

I want to add some instances of this class to a set, like this:

tom = Person('tom', 18)
mary = Person('mary', 22)
mary2 = Person('mary2', 22)

person_set = {tom, mary, mary2}
print(person_set)
# output: {<Person tom>, <Person mary>, <Person mary2>}

如您所见,集合中有 2 个玛丽.如何使具有相同年龄的 Person 实例被视为同一个人,并且只添加到集合中一次?

As you can see, there are 2 Marys in the set. How can I make it so that Person instances with the same age are considered the same person, and only added to the set once?

换句话说,我怎样才能得到 {<Person tom>, <Person mary>} 的结果?

In other words, how can I get a result of {<Person tom>, <Person mary>}?

推荐答案

当一个新对象被添加到一个python集合中时,首先计算对象的哈希码,然后,如果一个或多个对象具有相同的哈希值代码已经/已经在集合中,这些对象将被测试是否与新对象相等.

When a new object is being added to a python set, the hash code of the object is first computed and then, if one or more objects with the same hash code is/are already in the set, these objects are tested for equality with the new object.

这样做的结果是你需要实现 __hash__(...)__eq__(...) 类的方法.例如:

The upshot of this is that you need to implement the __hash__(...) and __eq__(...) methods on your class. For example:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return self.age == other.age

    def __hash__(self):
        return hash(self.age)

    def __repr__(self):
        return '<Person {}>'.format(self.name)

tom = Person('tom', 18)
mary = Person('mary', 22)
mary2 = Person('mary2', 22)

person_set = {tom, mary, mary2}
print(person_set)
# output: {<Person tom>, <Person mary>}

但是,您应该非常仔细地考虑 __hash____eq__ 的正确实现对于您的类应该是什么.上面的示例有效,但没有意义(例如,__hash____eq__ 都仅根据年龄定义).

However, you should think very carefully about what the correct implementation of __hash__ and __eq__ should be for your class. The above example works, but is non-sensical (e.g. in that both __hash__ and __eq__ are defined only in terms of age).

这篇关于将对象添加到python的集合中并通过对象的属性确定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)