具有基于键的默认值的Python dict

标签 python python-3.x dictionary defaultdict

我需要一个字典,它会自动为每个丢失的访问键填充一个默认值。我找到了 defaultdict 和其他一些实现此目的的方法,但我的问题是我希望每个键的默认值特定于键本身。

例如,使用 defaultdict 我可以实现这样的效果:

from collections import defaultdict
d = defaultdict(lambda: 5)
> d[1] = 3
> d[1]
> 3
> d[2]
> 5

但是,如果我需要为每个访问的缺失键设置默认值,例如 key + 5 怎么办?像这样的东西:

from collections import defaultdict
d = defaultdict(lambda key: key + 5)  # <-- This does not work as defaultdict expects lambda function to be without any parameters
> d[1] = 3
> d[1]
> 3
> d[2]
> 7         <- Calculated from accessed key + 5 (2+5)
> d[5]
> 10        <- Calculated from accessed key + 5 (5+5)

是否有一种干净的内置方法来实现我的需要?我知道我可以创建 dict 的子类并在 __getitem__ 级别实现此特定功能,但我想尽可能避免这种情况。

我在其他答案中找不到解决方案,如果仍然重复,我很抱歉。

最佳答案

我认为没有内置的方法可以做到这一点。但是,您可以子类化 defaultdict,而不是子类化 dict 并更改 getitem本身告诉 __missing__() 使用参数(key)调用 default_factory,而不是没有参数。它仍然是一个自定义类,而不是内置类,但它应该仍然非常高效。

from collections import defaultdict

class DefaultDict(defaultdict):
    def __missing__(self, key):
        return self.default_factory(key)

然后:

d = DefaultDict(lambda key: key + 5)

d[2]
# 7

关于具有基于键的默认值的Python dict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65901825/

相关文章:

python - 保存和加载类实例

python - 如何使用 MATPLOTLIB 设置标签?

python - 如何使用 meza 从 .mdb 获取表?

python-3.x - 机器学习预处理错误

python - python字典中的变量用于http header 构建

arrays - Swift:排序字典(按键或按值)并返回有序数组(键或值)

python - Python traceback.print_exc() 是否打印到标准输出或标准错误?

python - 列出函数/方法的参数并在 Python 3 中跳过 'self'

python - 导入错误: cannot import name 'RegexpReplacer'

c# - 基于元组或嵌套的字典有好处吗?