2012-05-17 14 views
8

Tengo un diccionario python dict1 con más de 20,000 claves y quiero update con otro diccionario dict2. Los diccionarios se ven así:inserte o actualice las claves en un diccionario python

dict1 
    key11=>[value11] 
    key12=>[value12] 
    ... 
    ... 
    keyxyz=>[value1x]  //common key 
    ...... so on 

dict2 
    key21=>[value21] 
    key22=>[value22] 
    ... 
    ... 
    keyxyz=>[value2x]  // common key 
    ........ so on 

si uso

dict1.update(dict2) 

continuación, las teclas de dict1 que son similares a las teclas de dict2 tendrán sus valores sobrescritos por los valores de dict2. Lo que quiero es que si una clave ya está presente en dict1, entonces el valor de esa clave en dict2 debe agregarse al valor de dict1. Así

dict1.conditionalUpdate(dict2) 

debería resultar en

dict1 
    key11=>[value11] 
    key12=>[value12] 
    key21=>[value21] 
    key22=>[value22] 
    ... 
    ... 
    keyxyz=>[value1x,value2x] 

Un método ingenuo sería iterar sobre las claves de dict2 para cada tecla de dict1 e insertar o las teclas de actualización. hay algun metodo mejor? ¿Admite python una estructura de datos integrada que admita este tipo de funcionalidad?

+0

Aquí hay una solución a una pregunta similar ya publicada. http://stackoverflow.com/questions/38987/how-can-i-merge-two-python-dictionaries-as-a-single-expression – ronyswag

+0

@ronyswag Esa no es la misma pregunta. –

Respuesta

9

Use defaultdict desde el módulo de colecciones.

>>> from collections import defaultdict 
>>> dict1 = {1:'a',2:'b',3:'c'} 
>>> dict2 = {1:'hello', 4:'four', 5:'five'} 
>>> my_dict = defaultdict(list) 
>>> for k in dict1: 
... my_dict[k].append(dict1[k]) 
... 
>>> for k in dict2: 
... my_dict[k].append(dict2[k]) 
... 
>>> my_dict[1] 
['a', 'hello'] 
+1

Correcto. De hecho, si revisa los documentos de Python, hay un ejemplo que casi coincide con lo que está solicitando: http://docs.python.org/library/collections.html#defaultdict-examples –

1

Esto es en realidad muy simple de hacer uso de una comprensión dict y itertools.groupby():

dict1 = {1: 1, 2: 2, 3: 3, 4: 4} 
dict2 = {5: 6, 7: 8, 1: 1, 2: 2} 

from itertools import groupby, chain 
from operator import itemgetter 

sorted_items = sorted(chain(dict1.items(), dict2.items())) 

print({key: [value[1] for value in values] for key, values in groupby(sorted_items, itemgetter(0))}) 

Nos da:

{1: [1, 1], 2: [2, 2], 3: [3], 4: [4], 5: [6], 7: [8]} 

Naturalmente, esto crea un nuevo dict, pero si necesidad a actualiza la primera dict, puedes hacer eso trivialmente actualizando con la nueva. Si sus valores ya son listas, esto puede requerir algunas modificaciones menores (pero supongo que estaba haciendo eso por el bien de la operación, en cuyo caso, no es necesario).

Naturalmente, si está utilizando Python 2.x, entonces usted tendrá que usar dict.viewitems() o dict.iteritems() sobre dict.items(). Si está utilizando una versión de Python antes de las comprensiones dict, en su lugar podría usar dict((key , value) for ...).

0

Otro método sin importar nada, sólo con el diccionario tradicional Python:

>>> dict1 = {1:'a',2:'b',3:'c'} 
>>> dict2 = {1:'hello', 4:'four', 5:'five'} 
>>> for k in dict2: 
... dict1[k] = dict1.get(k,"") + dict2.get(k) 
... 
>>> dict1 
{1: 'ahello', 2: 'b', 3: 'c', 4: 'four', 5: 'five'} 
>>> 

dict1.get(k,"") devuelve el valor asociado a k si existe o una cadena vacía de otra forma, y ​​luego agregar el contenido de dict2 .

Cuestiones relacionadas