繁体   English   中英

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

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

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

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 它由一个带有操作insertfind的抽象接口定义。 它不提供您想要的操作。 潜在的底层实现是否理论上可以支持您想要的操作并不是真正相关的。 而是使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM