繁体   English   中英

如何使用函数自动从非现有键创建值

[英]How to automatically create value from non existing key with a function

背景:

假设我有一个函数(当然在实际中这将是一个更复杂的函数):

def f(x):
    return str(x)

如果我想存储值以避免不必要的重新计算,我可以创建一个像这样的dict

my_dict = {x: f(x) for x in range(5)}

不过,如果我不事先知道哪些值我可能需要,例如10my_dict[10]显然产生一个KeyError

解决这个问题的一种方法是:

my_dict = {}
def get_value(x):
    if x not in my_dict:
        my_dict[x] = f(x)
    return my_dict[x]

get_value(10)

问题:这看起来与defaultdict非常相似:有没有办法使直观(但破坏) my_dict = defaultdict(f)工作,即当一个键x不存在时,它应该调用f(x)而不是f()创建默认值?

根据文档 ,您可以通过__missing__ defaultdict并覆盖__missing__来获得所需的行为:

from collections import defaultdict
class betterdefault(defaultdict):
    def __missing__(self, key):
        return self.default_factory(key)

现在,你想要充实说出来一点点额外的逻辑,如抛出KeyError ,如果self.default_factory是无,这样的东西,他们在文档提到。 希望这能指出你正确的方向。

这是一个快速演示

您可以构建自己的dict数据类型。 在你的情况下, __missing__将有所帮助。 如果没有密钥, __missing__方法会触发您的自定义工作。 下面是一个简单的例子。

from collections import UserDict
class MyDict(UserDict):
    def __missing__(self, key):
        self[key] = 2*key
        return self[key]

if __name__ == '__main__': # test
    a = MyDict((x, 2*x) for x in range(5))
    print(a)
    # {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
    a[5]
    # 10
    print(a)
    # {0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5:10}

另请注意, UserDict是字典对象的包装器,使您可以轻松地对字典数据类型进行子类化。

查看官方文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM