2024-03-29 10:08:33 发布
网友
Python不允许字典用作其他字典中的键。是否有使用非嵌套字典作为键的解决方法?
更复杂的不可散列对象和我的特定用例的一般问题是moved here。我对我的用例的最初描述是不正确的。
如果您有一个真正不可变的字典(尽管我不清楚为什么不使用一个成对的列表:例如[('content-type', 'text/plain'), ('host', 'example.com')]),那么您可以将dict转换为:
[('content-type', 'text/plain'), ('host', 'example.com')]
dict
一对一组。在你的问题上你已经做到了。需要tuple,而不是list,因为结果依赖于元素的顺序和不变性。
tuple
list
>>> tuple(sorted(a.items()))
冰冻的一套。从数学的角度来看,这是一种更合适的方法,因为它只要求不可变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__之后不会更改,如果没有则抛出异常)
__hash__
如果您有一个真正不可变的字典(尽管我不清楚为什么不使用一个成对的列表:例如
[('content-type', 'text/plain'), ('host', 'example.com')]
),那么您可以将dict
转换为:一对一组。在你的问题上你已经做到了。需要
tuple
,而不是list
,因为结果依赖于元素的顺序和不变性。冰冻的一套。从数学的角度来看,这是一种更合适的方法,因为它只要求不可变
dict
元素上的等式关系,而第一种方法要求除等式之外的排序关系。如果我需要使用字典作为键,我会将字典展成一个元组的元组。
你可能觉得这个问题很有用:What is the best way to implement nested dictionaries?
下面是一个扁平化模块的示例,它将扁平化字典:http://yawpycrypto.sourceforge.net/html/public/Flatten.Flatten-module.html
我不完全理解您的用例,我怀疑您试图过早地优化一些不需要优化的东西。
一种方法是对dict进行子类化并提供一个散列方法。即:
但是,请记住dict(或任何可变类型)不这样做的原因:将对象添加到哈希表后对其进行变异将更改哈希,这意味着dict现在将把它放在错误的bucket中,因此将返回不正确的结果。
如果您走这条路,要么非常确定dict放入另一个字典后不会更改,要么主动阻止它们(例如,检查hash在第一次调用
__hash__
之后不会更改,如果没有则抛出异常)相关问题 更多 >
编程相关推荐