关于什么可以/不能用作python dict的键,我有点困惑.
dicked = {}
dicked[None] = 'foo' # None ok
dicked[(1,3)] = 'baz' # tuple ok
import sys
dicked[sys] = 'bar' # wow, even a module is ok !
dicked[(1,[3])] = 'qux' # oops, not allowed
Run Code Online (Sandbox Code Playgroud)
所以一个元组是一个不可变的类型,但是如果我在其中隐藏一个列表,那么它就不能成为一个键......难道我不能轻易地隐藏模块中的列表吗?
我有一个模糊的想法,关键是必须"可以",但我只是承认自己对技术细节的无知; 我不知道这里到底发生了什么.如果您尝试使用列表作为键,将哈希作为其内存位置,会出现什么问题?
从最近的SO问题(参见在python中创建一个由列表索引的字典)我意识到我可能对python中可散列和不可变对象的含义有一个错误的概念.
Python不允许将不可清除的对象用作其他字典中的键.正如Andrey Vlasovskikh所指出的,对于使用非嵌套字典作为键的特殊情况,有一个很好的解决方法:
frozenset(a.items())#Can be put in the dictionary instead
Run Code Online (Sandbox Code Playgroud)
有没有使用任意对象作为词典中的键的方法?
示例:
如何将其用作钥匙?
{"a":1, "b":{"c":10}}
Run Code Online (Sandbox Code Playgroud)
您实际上必须在代码中使用类似的东西是非常罕见的.如果您认为是这种情况,请考虑先更改数据模型.
确切的用例
用例是缓存对任意关键字唯一函数的调用.字典中的每个键都是一个字符串(参数的名称),对象可能非常复杂,包括分层的字典,列表,元组等.
相关问题
这个子问题已从这里的问题中分离出来.这里的解决方案处理字典没有分层的情况.
我需要类似的东西
list_dict_dict = {
[] : {}
}
Run Code Online (Sandbox Code Playgroud)
问题是[] isable hashable并且不能用作字典键
我可以用来将列表映射到dict的任何数据结构吗?