【问题标题】:Python dict with default value based on key具有基于键的默认值的 Python dict
【发布时间】:2021-01-26 12:59:58
【问题描述】:

我需要一个字典,该字典会自动填充每个缺失的访问键的默认值。我找到了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 仅适用于不带参数的 lambda 函数,因此第二个示例不是有效的 python 代码。
  • 它只是显示了我想要最终得到什么样的功能
  • 哦,好的。我认为这是当前的行为,您需要进一步改进。

标签: python python-3.x dictionary defaultdict


【解决方案1】:

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

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

【讨论】:

  • 尽管我想避免创建子类,但这似乎是目前最好的解决方案,所以我会接受这个答案,谢谢!
【解决方案2】:

你也可以使用这样的函数

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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多