如何将三个列表压缩成嵌套的dict

Bra*_*ano 8 python dictionary list

我有三个列表:

z1 = ['A', 'A', 'B', 'B']
z2 = ['k1', 'k2', 'k1', 'k2']
z3 = ['v1', 'v2', 'v3', 'v4']
Run Code Online (Sandbox Code Playgroud)

当我写:

print(dict(zip(z2, z3)))
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

{'k2': 'v4', 'k1': 'v3'}
Run Code Online (Sandbox Code Playgroud)

我希望这个:

{'A':{'k1': 'v1', 'k2': 'v2'} , 'B':{'k1': 'v3', 'k2': 'v4'}}
Run Code Online (Sandbox Code Playgroud)

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

Roa*_*ner 11

该函数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'}})
Run Code Online (Sandbox Code Playgroud)

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

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

print(dict(d))
# {'A': {'k1': 'v1', 'k2': 'v2'}, 'B': {'k1': 'v3', 'k2': 'v4'}}
Run Code Online (Sandbox Code Playgroud)

注意: defaultdict它只是一个子类dict,因此您可以将其视为普通字典.