假设字典需要存在某些键。是否有一种简单的方法可以在缺少这些特定键时添加默认值?
例如:
default_dict = {'name': '', 'height': 100, 'age': 20}
d = {'name': 'James', 'age': 65}
d.set_defaults(default_dict)
会将字典d
更新为
{'name': 'James', 'age': 65, 'height': 100}
保留d
的原始值,只添加缺少的键。
在此过程中不应销毁default_dict
。
答案 0 :(得分:4)
创建默认值的副本,并使用d
进行更新;如果d
中的所有键都是字符串,则可以通过一次dict()
调用来执行此操作:
d = dict(default_dict, **d)
对于使用非字符串键的词典,您可以使用两个步骤:
d = default_dict.copy()
d.update({'name': 'James', 'age': 65})
或者您可以使用循环来使用字典视图中不存在的任何键来更新d
;但这并不是那么快:
d = {'name': 'James', 'age': 65}
d.update((k, default_dict[v]) for k in default_dict.viewkeys() - d)
在Python 3中将viewkeys
替换为keys
。
如果您使用的是Python 3.5或更高版本,则可以使用类似的语法创建新词典:
d = {**default_dict, 'name': 'James', 'age': 65}
首先应用default_dict
的键值对,然后是您设置的任何新键;这些将覆盖旧的。请参阅3.5什么是新文档中的PEP 448 - Additional Unpacking Generalizations。
创建新词典的任何方法都可以通过包装dict.update()
调用来更新现有词典。因此,第一个可以使用以下内容更新d
:
d.update(dict(default_dict, **d))
答案 1 :(得分:3)
要更新现有字典,我可能会使用字典的setdefault
方法:
for key, value in dict_of_defaults.items():
dict_maybe_without_defaults.setdefault(key, value)
如果我正在创建一个新词典,其中我有少量键,我可能会按照Martijn发布的解决方案做更多的事情。
答案 2 :(得分:1)
您可以考虑使用collections.ChainMap
关联回退:
import collections
default_dict = {'name': '', 'height': 100, 'age': 20}
d = collections.ChainMap({'name': 'James', 'age': 65},default_dict)
>>> d
ChainMap({'name': 'James', 'age': 65}, {'name': '', 'height': 100, 'age': 20})
>>> dict(d) #this flattens the map but isn't necessary for it to work
{'name': 'James', 'height': 100, 'age': 65}
另请注意,由于所有变异方法仅修改第一个映射default_dict
,因此pop
或其他方法是安全的。