对于列表列表,将字典与 collections.defaultdict 合并
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
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 是可变对象
这是一个简单的问题,但我对 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
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 是可变对象