Python:根据键从集合中获取项目

时间:2014-03-13 17:25:13

标签: python

我有一个带有自定义哈希方法的类。

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])

现在,有没有办法使用skey查找对象?即我想做的事:

find_using_key(s, 1) # should return [t1]

我知道我可以通过遍历集合中的项目来做到这一点,但我觉得应该有一个O(1)方法来执行此操作,因为key有效地确定了{{}中的“位置” 1}}。

2 个答案:

答案 0 :(得分:8)

  

...因为密钥有效地决定了'的位置'在集合

那不是真的。具有相同key的两个元素可以在集合中共存:

>>> t0, t1 = Test(1,1), Test(1,2)
>>> len(set((t0,t1)))
2

哈希值不定义相等性。这也是不可能的,因为你可能有哈希冲突。

至于你的问题:不要使用set。它由具有操作 insert find 的抽象接口定义。它不提供您想要的操作。潜在的底层实现是否理论上可以支持您想要的操作并不是真正相关的。而是使用dict,并将密钥与实例相关联。

答案 1 :(得分:4)

如果您不需要使用集合,则可以使用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])