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

问题描述

我需要一个字典,它会为每个缺失的访问键自动填充一个认值。我找到了 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__() 使用参数调用 default_factory({{1 }}),而不是没有参数。它仍然是一个自定义类,而不是内置类,但它应该仍然非常有效。

key

那么:

from collections import defaultdict

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

你也可以使用这样的函数

dic = {}
DEFAULT_VALUE = 5

def dict_get(item):
    try:
        return [dic[item]]
    except:
        dic[int(item)] = DEFAULT_VALUE + int(item)
        return DEFAULT_VALUE + int(item)

print(dict_get(10))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...