合并字典与循环

Merge dictionary with recurrence

我有一个循环:

all_rec = {}
for i in range(0, 2):
     rec = buildings[best_buildings[i]]['recommendations']

第一次迭代后'rec'的值:

rec = {'a': {'b': 2, 'c': 1}, 'd': {'e': 5}}

第二次迭代后'rec'的值:

rec = {'d': {'e': 4}}

'recommendations'的数据类型是字典。如何将此循环产生的所有 'rec' 词典添加到一个词典 'all_rec' 中?

我希望 'all_rec' 看起来像这样:

all_rec = {'a': {'b': 2, 'c': 1}, 'd': {'e': 5}, 'd': {'e': 4}}  

在新词典中同时保留 'd': {'e': 5} 和 'd': {'e': 4}。我如何在 Python 2.7 中做到这一点?

如果需要保留所有这些值,建议下层词典中的值应该是列表,至少对于汇总列表:

all_rec = {}
for i in range(0, 2):
     rec = buildings[best_buildings[i]]['recommendations']
     for dk, dc in rec.items():
         if dk not in all_rec:
             all_rec[dk] = {k:[v] for k,v in dc.items()}
         else:
             for k,v in dc.items():
                 if k in all_rec[dk]:
                     all_rec[dk][k].append(v)
                 else:
                     all_rec[dk][k] = [v]

print(all_rec)
{'a': {'b': [2], 'c': [1]}, 'd': {'e': [5,4]}}

这是Python3.7;我不知道您需要如何调整才能使用 2.7,但我尽可能保持基本。

我没有你的数据,但这是粗略的想法:

如要总结推荐:

from collections import defaultdict

all_rec = defaultdict(lambda: defaultdict(int))
for i in range(0, 2):
     rec[buildings[best_buildings[i]]] += buildings[best_buildings[i]]['recommendations']

如果要附加建议:

from collections import defaultdict

all_rec = defaultdict(lambda: defaultdict(list))
for i in range(0, 2):
     rec[buildings[best_buildings[i]]].append(buildings[best_buildings[i]]['recommendations'])

--- 演示

>>> from collections import defaultdict
>>> 
>>> demo = defaultdict(lambda: defaultdict(int))
>>> demo['a']['b'] += 1
>>> demo
defaultdict(<function <lambda> at 0x7f931a2d2700>, {'a': defaultdict(<class 'int'>, {'b': 1})})
>>> demo['a']['b'] += 1
>>> demo
defaultdict(<function <lambda> at 0x7f931a2d2700>, {'a': defaultdict(<class 'int'>, {'b': 2})})
>>> 
>>> demo = defaultdict(lambda: defaultdict(list))
>>> demo['a']['b'].append(1)
>>> demo
defaultdict(<function <lambda> at 0x7f931a2d2b80>, {'a': defaultdict(<class 'list'>, {'b': [1]})})
>>> demo['a']['b'].append(1)
>>> demo
defaultdict(<function <lambda> at 0x7f931a2d2b80>, {'a': defaultdict(<class 'list'>, {'b': [1, 1]})})
>>>