假设我有:
@dataclass
class Foo:
foo_id: int
# Other interesting fields.
def __hash__(self):
return self.foo_id.__hash__()
Run Code Online (Sandbox Code Playgroud)
我做了一个foos_set = {Foo(i) for i in range(10)}. 我一直假设set.remove使用哈希进行恒定时间查找。所以我认为这种想法应该foos_set.remove(6)有效是合理的。但实际上,它引发了一个KeyError. 你需要这样做foo_set.remove(Foo(6))。事实上,如果有更多字段,您需要确保所有字段都匹配!
我想对我来说正确的做法就是制作一个foos_dict = {i: Foo(i) for i in range(10)}. 我很乐意这样做,但它只是感觉不必要的笨重,所以我在这里询问是否还有另一个我不知道的容器。
字典是一个卓越的容器,它通过特定的信息(即键)进行索引。
实际上,集合是在整个条目上建立索引的,而不仅仅是在键上。列表的索引不是条目本身的一部分,而是其在列表中的位置。
所以
foos_dict = {i: Foo(i) for i in range(10)}
Run Code Online (Sandbox Code Playgroud)
事实上,这是实现您想要的目标的完美方式。
您实际上是在描述一本字典:
我还希望能够仅使用 ID 从集合中检索元素(无需进行搜索)。