Python dict 具有基于键的默认值

Cxo*_*ika 5 python dictionary python-3.x defaultdict

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

例如,defaultdict我可以实现这样的目标:

from collections import defaultdict
d = defaultdict(lambda: 5)
> d[1] = 3
> d[1]
> 3
> d[2]
> 5
Run Code Online (Sandbox Code Playgroud)

但是,如果我需要每个访问的缺失键的默认值,该怎么办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)
Run Code Online (Sandbox Code Playgroud)

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

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

Pie*_*e D 8

我认为没有内置的方法可以做到这一点。但是,您可以对自身进行子类化,以告诉使用参数(the )调用,而不是不使用参数,而不是子类化dict和更改。它仍然是一个自定义类,而不是内置类,但它应该仍然非常高效。getitemdefaultdict__missing__()default_factorykey

from collections import defaultdict

class DefaultDict(defaultdict):
    def __missing__(self, key):
        return self.default_factory(key)
Run Code Online (Sandbox Code Playgroud)

然后:

d = DefaultDict(lambda key: key + 5)

d[2]
# 7
Run Code Online (Sandbox Code Playgroud)