Python 对于列表列表,请将字典与collections.defaultdict合并

Python 对于列表列表,请将字典与collections.defaultdict合并,python,python-3.x,dictionary,defaultdict,dictionary-comprehension,Python,Python 3.x,Dictionary,Defaultdict,Dictionary Comprehension,这是一个简单的问题,但我对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

这是一个简单的问题,但我对
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(,{0:[35237245,3],1:[3524724620898,4],
2: [3540, 7247, 20899, 5], 4: [3541, 20901], 5: [3542, 7249, 20902], 
3:[724820900,6],6:[7250]}),defaultdict(,,
{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)
为空
将变为:

[defaultdict(,{0:[35237245],1:[3524724620898],2:[3540724720899],4:[354120901],5:[3542724920902],3:[724820900],6:[7250]}),defaultdict(,{0:[3],1:[4],2:[5],3:[6]})


请注意,第二个合并的
defaultdict
的预期输出不正确,因为每个键的值都应该是合并后的列表。此外,字典列表在合并后应成为
defaultdict
s列表,而不是
defaultdict
s列表。

您实际上没有字典列表,而是字典列表,并且您正在尝试将字典合并到子列表中,因此,您应该在遍历主列表的循环中初始化
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)
为空
将变为:

[defaultdict(,{0:[35237245],1:[3524724620898],2:[3540724720899],4:[354120901],5:[3542724920902],3:[724820900],6:[7250]}),defaultdict(,{0:[3],1:[4],2:[5],3:[6]})


请注意,第二个合并的
defaultdict
的预期输出不正确,因为每个键的值都应该是合并后的列表。此外,字典列表在合并后应成为
defaultdict
s列表的列表,而不是
defaultdict
s列表的列表。

您应该像这样初始化
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)
出局

[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(,{0:[35237245],1:[3524724620898],
2: [3540, 7247, 20899], 4: [3541, 20901], 5: [3542, 7249, 20902], 
3: [7248, 20900], 6: [7250]}), 
defaultdict(,{0:[3],1:[4],2:[5],3:[6]})]

注意,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)
出局

[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(,{0:[35237245],1:[3524724620898],
2: [3540, 7247, 20899], 4: [3541, 20901], 5: [3542, 7249, 20902], 
3: [7248, 20900], 6: [7250]}), 
defaultdict(,{0:[3],1:[4],2:[5],3:[6]})]

注意defaultdict是可变对象

我同意你的说法,但我也相信他希望看到如何将所有内容整合到一个整体中dict@vash_the_stampede我认为blshing上面的输出看起来是正确的,对吗?@blshing谢谢你的解释---我现在意识到我的错误了。推论:为什么在这种情况下使用
correct2=defaultdict(list)
而不是
correct2=dict()
?就这样我understand@ShanZhengYang哈,这是你的问题!不是我的:)我以为你在尝试生成一个包含everything@vash_the_stampede很抱歉我试图对问题进行编辑,使其更清楚。:)我同意你所说的,但我也相信他想看看如何把这一切融合在一起dict@vash_the_stampede我认为blshing上面的输出看起来是正确的,对吗?@blshing谢谢你的解释---我现在意识到我的错误了。推论:为什么在这种情况下使用
correct2=defaultdict(list)
而不是
correct2=dict()
?就这样我understand@ShanZhengYang哈,这是你的问题!不是我的:)我以为你在尝试生成一个包含everything@vash_the_stampede很抱歉我试图对问题进行编辑,使其更清楚。:)这是有道理的——我觉得我可能没有抓住要点。为什么在这种情况下使用
defaultdict(list)
,而不是
correct2=dict()
?性能上有差异吗?这是有道理的——我觉得我可能没有抓住要点。为什么在这种情况下使用
defaultdict(list)
,而不是
correct2=dict()
?是否存在性能差异?