[英]For a list of lists, merge the dictionaries with collections.defaultdict
這是一個簡單的問題,但我對collections.defaultdict
的行為感到困惑。 這是為了幫助我了解它是如何工作的。
這個問題是從這個有用的問題推斷出來的: 如何將多個詞典列表合並到列表中?
我們現在說我有一個詞典列表清單。 我想合並上面問題中詳述的字典:
list_of_dictionaries2 = [[{0:3523, 1:3524, 2:3540, 4:3541, 5:3542},
{0:7245, 1:7246, 2:7247, 3:7248, 5:7249, 6:7250},
{1:20898, 2:20899, 3:20900, 4:20901, 5:20902}], [{0:3, 1:4, 2:5, 3:6}]]
預期的答案是這樣的:
correct2 = [[{0:[3523, 7245], 1:[3524, 7246, 20898], 2:[3540, 7247, 20899],
3:[7248, 20900], 4:[3541, 20901], 5:[3542, 7249, 20902], 6:[7250]}],
[{0:3, 1:4, 2:5, 3:6}]]
以前,對於單個字典列表,我們通過創建一個默認值為列表的空字典來解決這個問題,即我們使用collections.defaultdict(list)
。
鑒於這種情況是一個列表列表,我認為另一個for循環將是解決方案,將字典附加到一個空列表:
from collections import defaultdict
correct2 = defaultdict(list)
empty = []
for smaller_list in list_of_dictionaries2:
for d in smaller_list:
for k,v in d.items():
correct2[k].append(v)
empty.append(correct2)
這是非常錯誤的。
>>> print(empty)
[defaultdict(<class 'list'>, {0: [3523, 7245, 3], 1: [3524, 7246, 20898, 4],
2: [3540, 7247, 20899, 5], 4: [3541, 20901], 5: [3542, 7249, 20902],
3: [7248, 20900, 6], 6: [7250]}), defaultdict(<class 'list'>,
{0: [3523, 7245, 3], 1: [3524, 7246, 20898, 4], 2: [3540, 7247, 20899, 5],
4: [3541, 20901], 5: [3542, 7249, 20902], 3: [7248, 20900, 6], 6: [7250]})]
看起來所有詞典都是合並的。 並且有兩份副本。 這不是我想要的。
如何對每個列表執行此操作,如上所述? 我在哪里弄錯了?
你實際上沒有字典列表,但是列出了字典列表,並且你正在嘗試合並子列表中的字典,所以你應該在遍歷主列表的循環中初始化你的defaultdict
:
empty = []
for smaller_list in list_of_dictionaries2:
correct2 = defaultdict(list)
for d in smaller_list:
for k,v in d.items():
correct2[k].append(v)
empty.append(correct2)
empty
將成為:
[defaultdict(<class 'list'>, {0: [3523, 7245], 1: [3524, 7246, 20898], 2: [3540, 7247, 20899], 4: [3541, 20901], 5: [3542, 7249, 20902], 3: [7248, 20900], 6: [7250]}), defaultdict(<class 'list'>, {0: [3], 1: [4], 2: [5], 3: [6]})]
請注意,第二個合並的defaultdict
預期輸出不正確,因為每個鍵的值應該是合並后的列表。 此外,字典列表列表應該成為合並后列表的defaultdict
列表,而不是列表的defaultdict
列表列表。
你應該像這樣初始化每個循環的correct2
for smaller_list in list_of_dictionaries2:
correct2 = defaultdict(list)
for d in smaller_list:
for k, v in d.items():
correct2[k].append(v)
empty.append(correct2)
out put將是
[defaultdict(<class 'list'>, {0: [3523, 7245], 1: [3524, 7246, 20898],
2: [3540, 7247, 20899], 4: [3541, 20901], 5: [3542, 7249, 20902],
3: [7248, 20900], 6: [7250]}),
defaultdict(<class 'list'>, {0: [3],1: [4], 2: [5], 3: [6]})]
請注意,defaultdict是可變對象
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.