Python 将多个字典与同一架构合并
假设我有一个长度未知、模式未知但一致的字典列表,如下所示。请注意,这些值始终是相同长度的列表Python 将多个字典与同一架构合并,python,dictionary,Python,Dictionary,假设我有一个长度未知、模式未知但一致的字典列表,如下所示。请注意,这些值始终是相同长度的列表 res = [{'x': [2, 1], 'v': [49280, 536704]}, {'x': [1, 4], 'v': [12336, 340000]}, {'x': [5, 6], 'v': [524360, 151624]}, {'x': [7, 1], 'v': [94280, 81968]}, {'x': [1, 1], 'v': [241856, 335904]}, {'x':
res = [{'x': [2, 1], 'v': [49280, 536704]},
{'x': [1, 4], 'v': [12336, 340000]},
{'x': [5, 6], 'v': [524360, 151624]},
{'x': [7, 1], 'v': [94280, 81968]},
{'x': [1, 1], 'v': [241856, 335904]},
{'x': [7, 7], 'v': [463016, 598040]},
{'x': [2, 9], 'v': [606256, 422016]},
{'x': [1, 1], 'v': [151680, 1237120]}]
有没有一种有效的方法将这些内容合并到一本词典中?本例的最终结果是:
{'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1],
'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}
工作解决方案
这是可行的,但我想知道这次行动是否需要一艘班轮
output_dct = {}
for dct in res:
for k, v in dct.items():
output_dct[k] = v if k not in output_dct.keys() else output_dct[k] + v
使用
dict.setdefault
Ex:
output_dct = {}
for dct in res:
for k, v in dct.items():
output_dct.setdefault(k, []).extend(v)
{'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1],
'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}
或者使用
collections.defaultdict
from collections import defaultdict
output_dct = defaultdict(list)
for dct in res:
for k, v in dct.items():
output_dct[k].extend(v)
print(output_dct)
输出:
output_dct = {}
for dct in res:
for k, v in dct.items():
output_dct.setdefault(k, []).extend(v)
{'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1],
'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}
使用
dict.setdefault
Ex:
output_dct = {}
for dct in res:
for k, v in dct.items():
output_dct.setdefault(k, []).extend(v)
{'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1],
'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}
或者使用
collections.defaultdict
from collections import defaultdict
output_dct = defaultdict(list)
for dct in res:
for k, v in dct.items():
output_dct[k].extend(v)
print(output_dct)
输出:
output_dct = {}
for dct in res:
for k, v in dct.items():
output_dct.setdefault(k, []).extend(v)
{'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1],
'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}
你说是一行吗?到理解手机
>>> {k: sum((d[k] for d in res), []) for d in res for k in d}
{'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1], 'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}
(编辑:实际上,我可能会像Rakesh那样使用
defaultdict
,因为嵌套理解在页面上很紧凑,但对代码的其他读者来说不一定很明显。)你说一行吗?到理解手机
>>> {k: sum((d[k] for d in res), []) for d in res for k in d}
{'x': [2, 1, 1, 4, 5, 6, 7, 1, 1, 1, 7, 7, 2, 9, 1, 1], 'v': [49280, 536704, 12336, 340000, 524360, 151624, 94280, 81968, 241856, 335904, 463016, 598040, 606256, 422016, 151680, 1237120]}
(编辑:实际上,我可能会像Rakesh那样使用defaultdict
,因为嵌套理解在页面上很紧凑,但对代码的其他读者来说不一定很明显。)