合并字典与循环
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]})})
>>>
我有一个循环:
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]})})
>>>