Tengo dos diccionarios que contienen una matriz de lista como un valor como este:

d1 = {'1':[12,32,44,12,34],'2':[21,34,11,65],'3':[44,12,98],'4':[65,71]}
d2 = {'1':[15,11,44,42,14],'2':[11,24,41,65]:'3':[41,22,48]}

¿Cómo puedo fusionar ambos diccionarios en uno solo en función de su clave similar, por lo que la respuesta será la siguiente:

d3 = {'1':[12,32,44,12,34,15,11,44,42,14],'2':[21,34,11,65,11,24,41,65],'3':[44,12,98,41,22,48],'4':[65,71]}
0
Faizalprbw 16 feb. 2017 a las 07:53

3 respuestas

La mejor respuesta

Obtenga todas las claves usando una unión de conjunto d1.keys() | d2.keys(), entonces es una comprensión de dict:

>>> {k: d1.get(k, []) + d2.get(k, []) for k in (d1.keys() | d2.keys())}
{'1': [12, 32, 44, 12, 34, 15, 11, 44, 42, 14],
 '2': [21, 34, 11, 65, 11, 24, 41, 65],
 '3': [44, 12, 98, 41, 22, 48],
 '4': [65, 71]}

Nota: Si obtiene TypeError, entonces está utilizando una versión anterior de Python. Simplemente puede cambiar .keys() a .viewkeys() para que funcione en ese caso.

7
wim 16 feb. 2017 a las 04:56

Como alternativa a @ wim's dict Comprension, podría usar un defaultdict de listas, extendiendo cada valor mientras itera sobre los diccionarios de entrada:

from collections import defaultdict

result = defaultdict(list)

for d in d1, d2:
    for k in d:
        result[k].extend(d[k])

Si lo desea, puede convertir result nuevamente a un dict estándar:

result = dict(result)
0
Community 23 may. 2017 a las 12:34

Otra alternativa usando defaultdict de la lista y chain:

from itertools import chain
from collections import defaultdict

d3 = defaultdict(list)
for k, val in chain(d1.items(), d2.items()):
    d3[k] = d3[k] + val
0
saurabhsuman4797 16 feb. 2017 a las 05:36