如何使用默认键更新python dict:在另一个dict中给出的值对

时间:2016-04-22 17:37:20

标签: python dictionary

假设字典需要存在某些键。是否有一种简单的方法可以在缺少这些特定键时添加默认值?

例如:

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

3 个答案:

答案 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或其他方法是安全的。