首页 > 解决方案 > 如何将三个列表压缩到嵌套字典中

问题描述

我有三个列表:

z1 = ['A', 'A', 'B', 'B']
z2 = ['k1', 'k2', 'k1', 'k2']
z3 = ['v1', 'v2', 'v3', 'v4']

当我写:

print(dict(zip(z2, z3)))

这是我的输出:

{'k2': 'v4', 'k1': 'v3'}

我希望这样:

{'A':{'k1': 'v1', 'k2': 'v2'} , 'B':{'k1': 'v3', 'k2': 'v4'}}

你能告诉我怎样才能得到我的预期结果吗?

标签: pythonlistdictionary

解决方案


该函数zip()可以接受两个以上的迭代。所以你可以使用zip(z1, z2, z3)而不是zip(z2, z3). 但是,您仍然需要对项目进行分组,因为简单的包装dict()将不起作用,因为它无法处理 3 元组所需的嵌套字典。

要正确分组项目,我会使用collections.defaultdict()

from collections import defaultdict

z1 = ['A', 'A', 'B', 'B']
z2 = ['k1', 'k2', 'k1', 'k2']
z3 = ['v1', 'v2', 'v3', 'v4']

d = defaultdict(dict)
for x, y, z in zip(z1, z2, z3):
    d[x][y] = z

print(d)
# defaultdict(<class 'dict'>, {'A': {'k1': 'v1', 'k2': 'v2'}, 'B': {'k1': 'v3', 'k2': 'v4'}})

上面的工作是因为defaultdict(dict)为不存在的键初始化字典。它为您处理键的字典创建。

此外,如果您将最终结果包装为dict

print(dict(d))
# {'A': {'k1': 'v1', 'k2': 'v2'}, 'B': {'k1': 'v3', 'k2': 'v4'}}

注意: defaultdict只是 的子类dict,因此您可以将其视为普通字典。


推荐阅读