我剛開始學習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}
有什麼不對呢?
我剛開始學習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}
有什麼不對呢?
字典不能有重複鍵,因此,第三個字典的值替換/因爲它們是從左至右,從dict1
,然後dict2
和dict3
開始評估覆蓋其他值。
如果你的詞典是,例如:
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]}
沒有什麼錯,最後添加的值會替換其他值。
的按鍵1
,2
,和3
只允許每個字典一次。這本字典建設:
finaldict = {**dict1,**dict2,**dict3}
添加鍵值,以finaldict
由左到右。因此,它與dict1
開始,有
finaldict = {1: 10, 2: 203, 3: 1456}
現在它移動dict2
,其中有值1
,2
和3
爲好,鍵和值,從而覆蓋10
,203
,並1456
與價值觀34
,2034
和176
。同樣,當它攝取dict3
時。
問題是,您不能連接兩個或多個字典與重複的鍵。 如果你不想改變你的鍵名,應追加其在列表中
dict_list = []
dict_list.append(dict)
在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()
對象,它可以讓你即使在一個不存在的鍵使用+=
。準備好後我會讓你看看。
字典中不能有重複鍵。你希望你的結果如何? –
添加的最後一個字典的值將替換所有其他字典。根據你的「正確」輸出是什麼? –
這裏唯一錯誤的是你的期望(無論那是什麼)。 –