Python 具有基于键的默认值的字典
Python dict with default value based on key
我需要一个字典,它会自动为每个丢失的访问键填充一个默认值。我找到了 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__
级别实现此特定功能,但我想尽可能避免这种情况。
我在其他答案中找不到解决方案,如果仍然重复,请见谅。
我认为没有内置的方法可以做到这一点。然而,代替 subclassing dict
和改变 getitem
,你可以 subclass defaultdict
本身告诉 __missing__()
调用 default_factory
带有参数(key
),而不是没有参数。它仍然是自定义的 class,不是内置的,但它应该仍然非常有效。
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
你也可以使用这样的函数
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))
我需要一个字典,它会自动为每个丢失的访问键填充一个默认值。我找到了 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__
级别实现此特定功能,但我想尽可能避免这种情况。
我在其他答案中找不到解决方案,如果仍然重复,请见谅。
我认为没有内置的方法可以做到这一点。然而,代替 subclassing dict
和改变 getitem
,你可以 subclass defaultdict
本身告诉 __missing__()
调用 default_factory
带有参数(key
),而不是没有参数。它仍然是自定义的 class,不是内置的,但它应该仍然非常有效。
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
你也可以使用这样的函数
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))