相关疑难解决方法(0)

为什么我不能在python中使用列表作为dict键?

关于什么可以/不能用作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)

所以一个元组是一个不可变的类型,但是如果我在其中隐藏一个列表,那么它就不能成为一个键......难道我不能轻易地隐藏模块中的列表吗?

我有一个模糊的想法,关键是必须"可以",但我只是承认自己对技术细节的无知; 我不知道这里到底发生了什么.如果您尝试使用列表作为键,将哈希作为其内存位置,会出现什么问题?

python dictionary tuples list hashable

82
推荐指数
6
解决办法
9万
查看次数

可洗,不变

从最近的SO问题(参见在python中创建一个由列表索引的字典)我意识到我可能对python中可散列和不可变对象的含义有一个错误的概念.

  • 在实践中,什么是可以平均的?
  • hashable和immutable之间的关系是什么?
  • 是否有可变对象是可清洗的或不可变的对象?

python hash immutability data-structures

76
推荐指数
4
解决办法
3万
查看次数

使用不可清除的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)

您实际上必须在代码中使用类似的东西是非常罕见的.如果您认为是这种情况,请考虑先更改数据模型.

确切的用例

用例是缓存对任意关键字唯一函数的调用.字典中的每个键都是一个字符串(参数的名称),对象可能非常复杂,包括分层的字典,列表,元组等.

相关问题

这个子问题已从这里的问题中分离出来.这里的解决方案处理字典没有分层的情况.

python

4
推荐指数
2
解决办法
4470
查看次数

Python:将列表映射到dict

我需要类似的东西

list_dict_dict = {
    [] : {}
}
Run Code Online (Sandbox Code Playgroud)

问题是[] isable hashable并且不能用作字典键

我可以用来将列表映射到dict的任何数据结构吗?

python dictionary list

1
推荐指数
1
解决办法
1186
查看次数