如何连接具有相同键值python的字典列表
Posted
技术标签:
【中文标题】如何连接具有相同键值python的字典列表【英文标题】:How to concat list of dicts with same key-value python 【发布时间】:2022-01-18 13:55:27 【问题描述】:我有一个存储在列表中的字典列表。我想将相同的字典合并为一个。
输入:
data = [
'company': 'DAZ', 'process': 'Acesses', 'task': 'security', 'cmp_hours': 5106, 'prc_hours':744, 'hours':6,
'company': 'DAZ', 'process': 'Acesses', 'task': 'Approve', 'cmp_hours': 5106, 'prc_hours':744, 'hours':10,
'company': 'CAP', 'process': 'Agreements', 'task': 'Check', 'cmp_hours': 400, 'prc_hours':50, 'hours':5,
'company': 'CAP', 'process': 'Offboarding', 'task': 'Formation', 'cmp_hours': 400, 'prc_hours':75, 'hours':7,
'company': 'TOO', 'process': 'Offboarding', 'task': 'Formation', 'cmp_hours': 200, 'prc_hours':32, 'hours':2
]
所需输出:
[
'DAZ': 'cmp_hours':5106, 'processes': ['process': 'Acesses', 'prc_hours' : 744,'tasks': ['task': 'security', 'hours': 6, 'task': 'Approve', 'hours': 10]],
'CAP': 'cmp_hours':400, 'processes': ['process': 'Agreements', 'prc_hours' : 50,'tasks': ['task': 'Check', 'hours': 5], 'process_name': 'Offboarding', 'prc_hours' : 75,'tasks': ['task': 'Formation', 'hours': 7]],
'TOO': 'cmp_hours':200, 'processes': ['process': 'Offboarding', 'prc_hours' : 32,'tasks': ['task': 'Formation', 'hours': 2]]
]
大致结构
[company : cmp_hours, 'processes': [process, prc_hours, 'tasks':[task, hours]]]
【问题讨论】:
这是一个简单的 for 循环逻辑,向我们展示您到目前为止所尝试的内容。 我被困在分解过程中的任务 你是什么意思? 我删除了公司的重复数据并将它们合并为一个,但我找不到将所有流程合并到一个字典中的解决方案,也可以按照示例中所示的任务进行 能否将您编写的用于将数据组合到问题中的代码包含在内? 【参考方案1】:您可以使用collections.defaultdict
进行递归:
from collections import defaultdict
def merge(d, p):
r = defaultdict(list)
for i in d:
r[i[p[0][0]]].append(i)
if p[0][1] is None:
return a:p[0][-1]:sum(i[p[0][-1]] for i in b),
**merge(b, p[1:]) for a, b in r.items()
return p[0][1]:[p[0][0]:a, p[0][-1]:sum(i[p[0][-1]] for i in b),
**( if not p[1:] else merge(b, p[1:])) for a, b in r.items()]
data = ['company': 'DAZ', 'process': 'Acesses', 'task': 'security', 'cmp_hours': 5106, 'prc_hours': 744, 'hours': 6, 'company': 'DAZ', 'process': 'Acesses', 'task': 'Approve', 'cmp_hours': 5106, 'prc_hours': 744, 'hours': 10, 'company': 'CAP', 'process': 'Agreements', 'task': 'Check', 'cmp_hours': 400, 'prc_hours': 50, 'hours': 5, 'company': 'CAP', 'process': 'Offboarding', 'task': 'Formation', 'cmp_hours': 400, 'prc_hours': 75, 'hours': 7, 'company': 'TOO', 'process': 'Offboarding', 'task': 'Formation', 'cmp_hours': 200, 'prc_hours': 32, 'hours': 2]
print(merge(data, [['company', None, 'cmp_hours'], ['process', 'processes', 'prc_hours'], ['task', 'tasks', 'hours']]))
输出:
'DAZ': 'cmp_hours': 10212, 'processes': ['process': 'Acesses', 'prc_hours': 1488, 'tasks': ['task': 'security', 'hours': 6, 'task': 'Approve', 'hours': 10]], 'CAP': 'cmp_hours': 800, 'processes': ['process': 'Agreements', 'prc_hours': 50, 'tasks': ['task': 'Check', 'hours': 5], 'process': 'Offboarding', 'prc_hours': 75, 'tasks': ['task': 'Formation', 'hours': 7]], 'TOO': 'cmp_hours': 200, 'processes': ['process': 'Offboarding', 'prc_hours': 32, 'tasks': ['task': 'Formation', 'hours': 2]]
【讨论】:
以上是关于如何连接具有相同键值python的字典列表的主要内容,如果未能解决你的问题,请参考以下文章
Python列表元素为字典时,如何根据其中某个相同的键值进行元素合并