【发布时间】:2011-05-12 14:48:46
【问题描述】:
一般来说,Python 集合似乎并不是为按键检索项目而设计的。这显然是字典的用途。但是无论如何,给定一个键,您可以从一个等于该键的集合中检索一个实例吗?
再一次,我知道这正是字典的用途,但据我所知,有正当的理由想要用一个集合来做这件事。假设你有一个类定义如下:
class Person:
def __init__(self, firstname, lastname, age):
self.firstname = firstname
self.lastname = lastname
self.age = age
现在,假设我要创建大量 Person 对象,并且每次创建 Person 对象时,我都需要确保它不是之前的 Person 对象的副本。如果Person 具有相同的firstname,则认为它们与另一个Person 重复,而不管其他实例变量如何。所以很自然的做法是将所有Person 对象插入到一个集合中,并定义__hash__ 和__eq__ 方法,以便Person 对象通过它们的firstname 进行比较。
另一种选择是创建一个包含Person 对象的字典,并使用单独创建的firstname 字符串作为键。这里的缺点是我会复制firstname 字符串。在大多数情况下,这并不是一个真正的问题,但如果我有 10,000,000 个Person 对象怎么办?就内存使用而言,冗余字符串存储真的会开始增加。
但如果两个Person 对象比较相等,我需要能够检索原始对象,以便可以以业务逻辑所需的方式合并其他实例变量(firstname 除外)。这让我回到了我的问题:我需要一些方法来从 set 检索实例。
有没有办法做到这一点?还是使用字典是这里唯一真正的选择?
【问题讨论】:
-
“Python 集似乎不是为按键检索项目而设计的”。这是一个定义问题。集合没有键。集合中的每个项目都是它自己的密钥。根据定义,“带键的集合”是字典。考虑到定义看起来很清楚,我不确定这个问题是否有意义。
标签: python python-3.x set