2012-05-17 17 views
8

Ho un dizionario python dict1 con più di 20.000 chiavi e voglio update con un altro dizionario dict2. I dizionari di simile a questa:inserire o aggiornare le chiavi in ​​un dizionario python

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

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

se uso

dict1.update(dict2) 

poi le chiavi del dict1 che sono simili alle chiavi di dict2 avranno i loro valori sovrascritti da valori di dict2. Quello che voglio è se una chiave è già presente in dict1 quindi il valore di quella chiave in dict2 dovrebbe essere aggiunto al valore di dict1. Così

dict1.conditionalUpdate(dict2) 

dovrebbe comportare

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

Metodo naive sarebbe iterazione di chiavi di dict2 per ogni chiave di dict1 e inserire o chiavi di aggiornamento. C'è un metodo migliore? Python supporta una struttura dati incorporata che supporta questo tipo di funzionalità?

+0

Ecco una soluzione a una domanda simile già pubblicata. http://stackoverflow.com/questions/38987/how-can-i-merge-two-python-dictionaries-as-a-single-expression – ronyswag

+0

@ronyswag Questa non è la stessa domanda. –

risposta

9

Utilizzare defaultdict dal modulo di raccolta.

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

corretto. Infatti, se controlli i documenti Python c'è un esempio che corrisponde quasi a quello che stai chiedendo - http://docs.python.org/library/collections.html#defaultdict-examples –

1

Questo è in realtà piuttosto semplice da fare con la comprensione dict e 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))}) 

ci dà:

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

Naturalmente, questo crea un nuovo dizionario, ma se si necessità a aggiorna il primo dict, puoi farlo banalmente aggiornando con quello nuovo. Se i tuoi valori sono già elenchi, questo potrebbe richiedere alcune modifiche minori (ma presumo che lo stavi facendo per l'operazione, nel qual caso non è necessario).

Naturalmente, se si utilizza Python 2.x, sarà necessario utilizzare dict.viewitems() o dict.iteritems() su dict.items(). Se stai usando una versione di Python prima di dettare le comprensioni, allora potresti usare dict((key , value) for ...).

0

Un altro metodo senza importare nulla, solo con la normale dizionario 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,"") restituisce il valore associato al k se esiste o una stringa vuota in caso contrario, e quindi aggiungere il contenuto di dict2 .

Problemi correlati