![](/img/trans.png)
[英]How to create a dictionary from existing list? Key Value must be the amount of repeats for that key
[英]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)}
不过,如果我不事先知道哪些值我可能需要,例如10
, my_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()
创建默认值?
您可以构建自己的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.