2016-03-23 16 views
6

In Python, quando unisco due dizionari utilizzando il metodo update(), le eventuali chiavi esistenti verranno sovrascritte.Unione di due dizionari mantenendo l'originale

C'è un modo per unire i due dizionari mantenendo le chiavi originali nel risultato unito?

Aggiornamento

dire che abbiamo avuto il seguente esempio:

dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3} 
dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5} 

Possiamo unire i due dizionari, tale che il risultato non mancherà di tenere entrambi i valori per la chiave bookC?

vorrei dict3 assomigliare a questo:

{'bookA': 1, 'bookB': 2, 'bookC': (2,3), 'bookD': 4, 'bookE': 5} 
+3

Can dai un input/output di esempio? – Bahrom

+0

correlati? [Aggiornamento di un dizionario Python durante l'aggiunta a chiavi esistenti?] (Http://stackoverflow.com/questions/16745529/updating-a-python-dictionary-while-adding-to-existing-keys) – alecxe

+0

Che cosa esattamente vuoi capita di chiavi che sono presenti in entrambi i dict? – jwodder

risposta

9

Se è giusto mantenere tutti i valori come un elenco (che preferirei, aggiunge solo un ulteriore mal di testa e logica w gallina i tipi di dati di valore non sono coerenti), è possibile utilizzare l'approccio seguito per il tuo esempio aggiornato utilizzando un defaultdict

from itertools import chain 
from collections import defaultdict 

d1 = {'a': 1, 'b': 2, 'c': 3} 
d2 = {'a': 2, 'b': 3, 'd': 4} 

d3 = defaultdict(list) 

for k, v in chain(d1.items(), d2.items()): 
    d3[k].append(v) 

for k, v in d3.items(): 
    print(k, v) 

Stampe:

a [1, 2] 
d [4] 
c [3] 
b [2, 3] 

si ha anche l'approccio seguito, che trovo un po 'meno leggibile:

d1 = {'a': 1, 'b': 2, 'c': 3} 
d2 = {'a': 2, 'b': 3,} 

d3 = dict((k, [v] + ([d2[k]] if k in d2 else [])) for (k, v) in d1.items()) 

print(d3) 

Questa abitudine modificare uno qualsiasi dei dizionari originali e di stampa:

012.351.
{'b': [2, 3], 'c': [3], 'a': [1, 2]} 
+0

Ok, hai aggiornato il tuo esempio, dammi un po 'per aggiornare la mia risposta ... – Bahrom

+0

sì, certo :-) Per favore prenditi del tempo, apprezzalo! – Simplicity

+1

E gli elementi in d2 che non sono in d1? Riusciranno a d3 con l'implementazione di cui sopra? – EduardoCMB

1
a = {'a': 1, 'b': 2, 'c': 3} 
b = {'a': 10, 'd': 2, 'e': 3} 

for k in b: 
    if k not in a: 
     a[k] = b[k] 

Aggiornamento

Dopo l'aggiornamento alla domanda Sono d'accordo con l'attuazione di BAH di utilizzare un defaultdict con una lista

+0

"Possiamo unire i due dizionari, in modo che il risultato mantenga ** entrambi i valori ** per il key bookC?" – SiHa

+0

Avviso l'aggiornamento che ha pubblicato. A questa risposta è stato risposto prima ... – J2C

+0

OK, ma non risponde alla domanda così com'è attualmente. A volte capita che una domanda venga modificata per invalidare una risposta.Quella risposta dovrebbe essere cambiata o cancellata. – SiHa

2
a = {'a': 1, 'b': 2, 'c': 3} 
b = {'a': 10, 'd': 2, 'e': 3} 

b.update({key: (a[key], b[key]) for key in set(a.keys()) & set(b.keys())}) 
b.update({key: a[key] for key in set(a.keys()) - set(b.keys())}) 

print(b) 

uscita: { 'c': 3, 'd': 2, 'e': 3, 'b': 2, 'a': (1, 10)}

+1

l'output dovrebbe avere la chiave di entrambi 'a' e' b' – Copperfield

+0

Grazie a @Copperfield, l'ho corretto ora –