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}]}]}}]
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óduloitertools
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:
Este código utiliza un bucle
for
y la funcióngroupby
para iterar a través de cada grupo de diccionarios con el mismo nombre de empresa. Para cada grupo, crea un diccionario llamadocompany_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 deprc_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 listaprocesses
, con el nombre del proceso, el valor deprc_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.