2017-03-28 13 views
-2

我剛開始學習Python和我想使用此代碼來串聯詞典:串聯字典給出錯誤的輸出

dict1= {1: 10, 2: 203, 3: 1456} 
dict2 = {1: 34, 2: 2034, 3: 176} 
dict3 = {1: 134, 2: 2340, 3: 126} 
finaldict = {**dict1,**dict2,**dict3} 
print(finaldict) 

但只打印{1: 134, 2: 2340, 3: 126}

有什麼不對呢?

+4

字典中不能有重複鍵。你希望你的結果如何? –

+4

添加的最後一個字典的值將替換所有其他字典。根據你的「正確」輸出是什麼? –

+3

這裏唯一錯誤的是你的期望(無論那是什麼)。 –

回答

1

字典不能有重複鍵,因此,第三個字典的值替換/因爲它們是從左至右,從dict1,然後dict2dict3開始評估覆蓋其他值。

如果你的詞典是,例如:

dict1= {9: 10, 8: 203, 7: 1456} 
dict2 = {6: 34, 5: 2034, 4: 176} 
dict3 = {3: 134, 2: 2340, 1: 126} 

輸出將是:

{9: 10, 8: 203, 7: 1456, 6: 34, 5: 2034, 4: 176, 3: 134, 2: 2340, 1: 126} 

但因爲所有字典的鍵是相同的,他們只是在更換新的值。


對於這種情況,我會使用的tuples(鍵 - 值對)的陣列來處理這個更好,從而避免覆蓋:

dict1= {1: 10, 2: 203, 3: 1456} 
dict2 = {1: 34, 2: 2034, 3: 176} 
dict3 = {1: 134, 2: 2340, 3: 126} 
finalDict = list(dict1.items()) + list(dict2.items()) + list(dict3.items()) 
print(finalDict) 

輸出:

[(1, 10), (2, 203), (3, 1456), (1, 34), (2, 2034), (3, 176), (1, 134), (2, 2340), (3, 126)] 

An另一種方法是使用字典理解,以形成用於每個鍵的值的列表,如下所示:

dict1 = {1: 10, 2: 203, 3: 1456} 
dict2 = {1: 34, 2: 2034, 3: 176} 
dict3 = {1: 134, 2: 2340, 3: 126} 
newDict = {key: [value, dict2[key], dict3[key]] for key, value in dict1.items()} 
print(newDict) 

輸出:

{1: [10, 34, 134], 2: [203, 2034, 2340], 3: [1456, 176, 126]} 
2

沒有什麼錯,最後添加的值會替換其他值。

3

的按鍵12,和3只允許每個字典一次。這本字典建設:

finaldict = {**dict1,**dict2,**dict3} 

添加鍵值,以finaldict由左到右。因此,它與dict1開始,有

finaldict = {1: 10, 2: 203, 3: 1456} 

現在它移動dict2,其中有值123爲好,鍵和值,從而覆蓋10203,並1456與價值觀342034176。同樣,當它攝取dict3時。

0

問題是,您不能連接兩個或多個字典與重複的鍵。 如果你不想改變你的鍵名,應追加其在列表中

dict_list = [] 
dict_list.append(dict) 
0

在offchance那是你期待的是,在重複鍵的值將進行彙總,這裏是一個辦法要做到這一點

finaldict = {} 
for d in (dict1,dict2,dict3): 
    for k,v in d.items(): 
     if k in finaldict: 
      finaldict[k] += v 
     else: 
      finaldict[k] = v 

有一個在collections類目錄Counter()對象,它可以讓你即使在一個不存在的鍵使用+=。準備好後我會讓你看看。