如何创建一个通用的基于身份的哈希字典?

时间:2019-04-03 18:09:00

标签: python dictionary identity

上下文 我想在python之上实现一种语言,该语言需要向现有python对象添加元数据,但是我不想修改所有python对象的基础表示形式。我可以计算并存储每个对象的ID,然后将其用作传统Python字典的键。但这是不可思议的浪​​费,因为这些ID可以很快从对象本身派生。其他编程语言(Lisp,Java等)具有“身份哈希”,该哈希基于密钥对象的身份进行哈希运算,并调用其哈希函数。

是否可以在Python中做到这一点而无需不从头开始编写自己的哈希值?

1 个答案:

答案 0 :(得分:2)

@Paritosh明确地说:只需添加使用id作为密钥:

mydict[id(myobj)] = myvalue

或ID的哈希值:

mydict[hash(id(myobj))] = myvalue #Note you could just hash(myobj) for many objects.

您可以将其包装在某些类中,但这对我来说似乎是致命的,尽管这取决于您的确切用例。 但这不是真正的哈希图-因此可能会发生冲突并覆盖现有对象。您可以添加逻辑以检查密钥是否存在,然后在其中创建列表:

newhash = hash(id(myobj))
if newhash in mydict: #O(1)
    try: mydict[newhash].append(myvalue)
    except AttributeError: mydict[newhash] = [mydict[newhash],myvalue]
else: mydict[newhash] = myvalue

,或仅使用defaultdict。这可能是新班级的更好候选人。

@Patrick提出了一个问题,即您想做的事可能没有任何意义-您将不知道如何引用该对象,而又不知道该对象与id相关联。如果保留一些添加的ID列表,则可能会有些道理,再次取决于用例。