簡體   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