使用Python字典作为键(非嵌套)

2024-03-29 10:08:33 发布

您现在位置:Python中文网/ 问答频道 /正文

Python不允许字典用作其他字典中的键。是否有使用非嵌套字典作为键的解决方法?

更复杂的不可散列对象和我的特定用例的一般问题是moved here。我对我的用例的最初描述是不正确的。


Tags: 对象方法字典here用例moved
3条回答

如果您有一个真正不可变的字典(尽管我不清楚为什么不使用一个成对的列表:例如[('content-type', 'text/plain'), ('host', 'example.com')]),那么您可以将dict转换为:

  1. 一对一组。在你的问题上你已经做到了。需要tuple,而不是list,因为结果依赖于元素的顺序和不变性。

    >>> tuple(sorted(a.items()))
    
  2. 冰冻的一套。从数学的角度来看,这是一种更合适的方法,因为它只要求不可变dict元素上的等式关系,而第一种方法要求除等式之外的排序关系。

    >>> frozenset(a.items())
    

如果我需要使用字典作为键,我会将字典展成一个元组的元组。

你可能觉得这个问题很有用:What is the best way to implement nested dictionaries?

下面是一个扁平化模块的示例,它将扁平化字典:http://yawpycrypto.sourceforge.net/html/public/Flatten.Flatten-module.html

我不完全理解您的用例,我怀疑您试图过早地优化一些不需要优化的东西。

一种方法是对dict进行子类化并提供一个散列方法。即:

class HashableDict(dict):
    def __hash__(self):
        return hash(tuple(sorted(self.iteritems())))

>>> d = HashableDict(a=1, b=2)
>>> d2 = { d : "foo"}
>>> d2[HashableDict(a=1, b=2)]
"foo"

但是,请记住dict(或任何可变类型)不这样做的原因:将对象添加到哈希表后对其进行变异将更改哈希,这意味着dict现在将把它放在错误的bucket中,因此将返回不正确的结果。

如果您走这条路,要么非常确定dict放入另一个字典后不会更改,要么主动阻止它们(例如,检查hash在第一次调用__hash__之后不会更改,如果没有则抛出异常)

相关问题 更多 >