【问题标题】:How to concat list of dicts with same key-value python如何连接具有相同键值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 循环逻辑,向我们展示您到目前为止所尝试的内容。
  • 我被困在分解过程中的任务
  • 你是什么意思?
  • 我删除了公司的重复数据并将它们合并为一个,但我找不到将所有流程合并到一个字典中的解决方案,也可以按照示例中所示的任务进行
  • 能否将您编写的用于将数据组合到问题中的代码包含在内?

标签: python json loops dictionary merge


【解决方案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}]}]}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2019-08-18
    • 1970-01-01
    • 2019-11-18
    • 2021-06-01
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多