es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo concatenar una lista de diccionarios con la misma clave-valor en Python.

Tengo una lista de diccionarios almacenados en la lista. Quiero fusionar los mismos diccionarios en uno solo.

Entrada:

        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}
          ]

Salida requerida:

 [
    {
    '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}]}]}
    }
 ]

Estructura aproximada:

  [{company : {cmp_hours, 'processes': [{'process', prc_hours, 'tasks':[{'task', hours}]}]}}]
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para fusionar los mismos diccionarios en una lista, primero necesitamos iterar a través de la lista y agrupar los diccionarios con el mismo nombre de empresa. Luego, podemos fusionar esos diccionarios en un solo diccionario para cada empresa, con una lista de procesos y sus tareas y horas correspondientes.

    Para hacer esto, podemos usar la función groupby del módulo itertools para agrupar los diccionarios por su nombre de empresa. Luego, podemos iterar a través de cada grupo y extraer la información relevante para crear el diccionario fusionado para esa empresa.

    Aquí está el código que lograría esto:

    from itertools import groupby
    
    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}
    ]
    
    merged_data = []
    
    for company, group in groupby(data, lambda x: x['company']):
        company_data = {'cmp_hours': 0, 'processes': []}
        for item in group:
            company_data['cmp_hours'] += item['cmp_hours']
            process_exists = False
            for process in company_data['processes']:
                if process['process'] == item['process']:
                    process_exists = True
                    process['prc_hours'] += item['prc_hours']
                    process['tasks'].append({'task': item['task'], 'hours': item['hours']})
                    break
            if not process_exists:
                company_data['processes'].append({'process': item['process'], 'prc_hours': item['prc_hours'], 'tasks': [{'task': item['task'], 'hours': item['hours']}]})
    
    
        merged_data.append({company: company_data})
    
    print(merged_data)
    

    Este código utiliza un bucle for y la función groupby para iterar a través de cada grupo de diccionarios con el mismo nombre de empresa. Para cada grupo, crea un diccionario llamado company_data para almacenar la información fusionada para esa empresa.

    El bucle luego itera a través de cada elemento en el grupo y actualiza el valor de cmp_hours para la empresa. Luego, verifica si el proceso actual ya existe en la lista de procesos para la empresa. Si existe, actualiza el valor de prc_hours para ese proceso y agrega la tarea actual y sus horas a la lista de tareas para ese proceso. Si el proceso no existe, agrega un nuevo diccionario para ese proceso a la lista processes, con el nombre del proceso, el valor de prc_hours y una lista que contiene la tarea actual y sus horas.

    Finalmente, agrega los datos fusionados para cada empresa a una nueva lista llamada merged_data, que contiene un solo diccionario para cada empresa con el nombre de la empresa como clave y la información fusionada como valor.

    La salida de este código debería coincidir con la estructura de salida requerida mostrada en la pregunta.

Comments are closed.