2016-03-23 23 views
6

Python'da, update() yöntemini kullanarak iki sözlükte birleştirdiğimde, varolan anahtarların üzerine yazılır.Orijinali koruyarak iki sözlük birleştirme

Orijinal anahtarlar birleştirilmiş sonuçta tutulurken, iki sözlüğü birleştirmenin bir yolu var mı?

Güncelleme

aşağıdaki örneği olduğunu varsayalım: Biz sonuç anahtar bookC için iki değeri tutacak şekilde, iki sözlükleri birleştirebilir miyim

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

?

Böyle bakmak dict3 istiyorum:

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

Can örnek bir giriş/çıkış veriyorsunuz? – Bahrom

+0

İlgili? [Mevcut anahtarlara eklerken bir python sözlüğü güncelleniyor mu?] (Http://stackoverflow.com/questions/16745529/updating-a-python-dictionary-while-adding-to-existing-keys) – alecxe

+0

Tam olarak ne yapmak istiyorsunuz? her iki dilde de mevcut olan tuşlara ne olur? – jwodder

cevap

9

Ben bulmak Ayrıca aşağıda yaklaşım

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

: tavuk değerinizi veri türleri, bir 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) 

Baskı kullanarak güncellenmiş örneği için aşağıdaki yaklaşımı kullanabilirsiniz) tutarlı değil biraz daha az okunabilir:

:

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) 

Bu alışkanlık orijinal sözlükler ve baskı herhangi değiştirmek

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

Tamam, örneğini güncelledin, cevabımı güncellemek için bana biraz ver ... – Bahrom

+0

evet, emin :-) Lütfen zaman ayır, takdir et! – Simplicity

+1

d2'de d1'de olmayan öğelerden ne haber? Yukarıdaki uygulama ile d3'e ulaşacaklar mı? – 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] 

Güncelleme

Ben listesini içeren bir defaultdict kullanmanın Bah uygulamasına kabul edeceğini soruya güncellemesinden sonra Tüm değerleri bir liste olarak tutmayı tercih ederseniz (ki bunu tercih ederim, sadece ek olarak baş ağrısı ve mantık eklenir.)

+0

"İki sözlüğü birleştirebilir miyiz, sonuç anahtar anahtar için ** her iki değeri de ** koruyacak mı?" – SiHa

+0

Gönderdiği güncellemeye dikkat edin. Bu daha önce cevaplandı ... – J2C

+0

Tamam, ama şu anda geçerli olan soruya cevap vermiyor. Bazen bir sorunun bir yanıtı geçersiz kılmak için düzenlenmiş olması olur.Bu cevap değiştirilmeli veya silinmelidir. – 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) 

Çıkış: { 'c': 3, d '': 2, 'e': 3 'b',: 2, 'a': (1, 10)}

+1

çıktısının her ikisi de 'a' ve' b' – Copperfield

+0

anahtarına sahip olmalıdır. Teşekkürler @Copperfield, şimdi düzeltdim –