[英]Python: get item from set based on key
我有一个使用自定义哈希方法的类。
class Test(object):
def __init__(self, key, value):
self.key = key # key is unique
self.value = value
def __hash__(self):
# 'value' is unhashable, so return the hash of 'key'
return hash(self.key)
我使用这个类的对象创建一个set
。
t0, t1, t2 = Test(0, 10), Test(1, 5), Test(2, 10)
s = set([t0, t1, t2])
现在,有没有办法使用key
从s
查找对象? 即我想做:
find_using_key(s, 1) # should return [t1]
我知道我可以通过遍历集合中的项目来做到这一点,但我觉得应该有一个O(1)方法来执行此操作,因为key
有效地确定了set
的“位置”。
...因为键有效地确定了集合中的“位置”
那不是真的。 具有相同key
两个元素可以在集合中共存:
>>> t0, t1 = Test(1,1), Test(1,2)
>>> len(set((t0,t1)))
2
哈希值不定义相等性。 这也是不可能的,因为你可以有哈希冲突。
至于你的问题:不要使用set
。 它由一个带有操作insert和find的抽象接口定义。 它不提供您想要的操作。 潜在的底层实现是否理论上可以支持您想要的操作并不是真正相关的。 而是使用dict
,并将键与实例相关联。
如果您不需要使用集合,则可以使用dict进行O(1)
查找。 只需使用您的密钥作为dict项目的密钥:
d = {}
d[t0.key] = t0
d[t1.key] = t1
d[t2.key] = t2
您可以使用dict理解来使其更清晰:
d = {t.key: t for t in [t0,t1,t2]}
或者在2.6中:
d = dict((t.key,t) for t in [t0,t1,t2])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.