问题描述
我需要一个字典,它会为每个缺失的访问键自动填充一个默认值。我找到了 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))