dict.update覆盖已有键,如何避免?
在Python中使用更新函数合并字典时,如果两个字典有相同的键,后面的字典会把前面的字典的值覆盖掉。
举个简单的例子:
simple_dict_one = {'name': "tom", 'age': 20}
simple_dict_two = {'name': "lisa", 'age': 17}
simple_dict_one.update(simple_dict_two)
合并后,剩下的字典是:
{'age': 17, 'name': 'lisa'}
所以如果两个字典里有相同的键,最后只会保留一个(看起来是最后一个)。如果我有很多名字来自不同的来源,我可能会想先把每个来源的名字放到一个临时字典里,然后再把这些临时字典合并到一个更大的字典里。
有没有办法合并两个字典,同时保留所有的键呢?我想应该是每个键都要唯一,但如果这样的话,我该怎么合并两个字典而不丢失数据呢?
1 个回答
4
我有几个地方可以获取信息,比如一个ldap数据库,还有一些其他的地方,我在这些地方有一些Python函数,每个函数都会创建一个临时的字典。但我想要最后得到一个完整的字典,把所有来源的信息都合并到一起,也就是说我希望有一个字典来保存所有的信息。
你想要做的“合并”其实不是最理想的方式。正如你自己所说的:
我想你应该只用一个独特的键。
这就让把所有信息放到一个字典里变得相对困难,而且没必要。
你可以做的,不是对现有的字典使用.update()
,而是添加一个子字典。这个子字典的键可以是你获取信息的来源名称。值则可以是你从这个来源得到的字典。如果你需要存储同一个来源的多个字典,可以把它们放在一个列表里。
举个例子:
>>> data = {}
>>> person_1 = {'name': 'lisa', 'age': 17}
>>> person_2 = {'name': 'tom', 'age': 20}
>>> data['people'] = [person_1, person_2]
>>> data
{'people': [{'age': 17, 'name': 'lisa'}, {'age': 20, 'name': 'tom'}]}
然后每当你需要添加新获取的信息时,只需在data
字典中添加一个新条目。
>>> ldap_data = {'foo': 1, 'bar': 'baz'} # just some dummy data
>>> data['ldap_data'] = ldap_data
>>> data
{'people': [{'age': 17, 'name': 'lisa'}, {'age': 20, 'name': 'tom'}],
'ldap_data': {'foo': 1, 'bar': 'baz'}}
特定来源的数据可以很方便地从data
字典中提取出来。
>>> data['people']
[{'age': 17, 'name': 'lisa'}, {'age': 20, 'name': 'tom'}]
>>> data['ldap_data']
{'foo': 1, 'bar': 'baz'}