dict.update覆盖已有键,如何避免?

4 投票
1 回答
14212 浏览
提问于 2025-04-29 00:39

在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'}

撰写回答