如何在python中组合(附加值)两个具有相同键的嵌套字典


dist = {'Berlin': {'Boston' : 6096.945, 'LA' : 9331.657, 'Chicago' : 7102.591},
'Vienna': {'Boston' : 6508.405, 'LA' : 9841.482, 'Chicago' : 7560.970}, 
'London': {'Boston' : 5484.658, 'LA' : 9383.686, 'Chicago' : 6741.855}}
time = {'Berlin': {'Boston' : 6, 'LA' : 9, 'Chicago' : 7},
'Vienna': {'Boston' : 6, 'LA' : 9, 'Chicago' : 7}, 
'London': {'Boston' : 5, 'LA' : 8, 'Chicago' : 6}}

如何合并两个字典以获得列表中的值,如下所示:

new_dict = {'Berlin': {'Boston' : [6096.95, 6], 'LA' : [9331.65, 9], 'Chicago' : [7102.59, 7]},
'Vienna': {'Boston' : [6508.40, 6], 'LA' : [9841.48, 9], 'Chicago' : [7560.97, 7]}, 
'London': {'Boston' : [5484.65, 5], 'LA' : [9383.68, 8], 'Chicago' : [6741.85, 6]}}

提前谢谢!

您可以通过两级dict理解来解决这个问题

result = {
city_from: {city_to: [distance_val, time[city_from][city_to]]
for city_to, distance_val in cities_to.items()}
for city_from, cities_to in dist.items()
}

环路解决方案的经典2等价物

result = defaultdict(dict) # from collections import defaultdict
for city_from, cities_to in dist.items():
for city_to, distance_val in cities_to.items():
result[city_from][city_to] = [distance_val, time[city_from][city_to]]

不太优雅,但有效:

def combine_dicts(a, b):
for key in b:
if key in a:
if isinstance(a[key], dict) and isinstance(b[key], dict):
combine_dicts(a[key], b[key])
else:
a[key] = [a[key], b[key]]
else:
a[key] = [a[key], b[key]]
return a

注意:此函数将更改原始dicta,如果您不想保持原始dict不变,请将副本传递给func

from copy import deepcopy
combined = combine_dicts(deepcopy(dist), deepcopy(time))

最新更新