如何创建嵌套字典 PYTHON
How to create nested dictionaries PYTHON
这个问题和我在How to Create Nested Dictionary in Python with 3 lists
学到的另一个问题很相似
如何从 3 个列表中获得如下输出形式的输出
a = ['A', 'B', 'C', 'D']
b = [1,2,3,4]
c = ['N1', 'N2', 'N3', N4]
output = [{'A': {'N1':1}}, {'B':{'N2':2}}, {'C':{'N3':3}}, {'D':{'N4':4}}]
输出与发布的内容不同 link。
如果我可以描述这个,我会说它是一本字典,其中 'N#' 是值 1-4 的关键字,而这些字典又具有关键字 'A'-'D',它们看起来都是成为一些未显示的顶级关键字中的字典,它们都是该主关键字的元素。
我使用了提供输出的这行代码。这些值与我使用的值不同,但重点是边缘处没有那么多大括号或方括号
d = {k: {x: y} for k, x, y in zip(a, b, c)}
# output: {'A':{'1' :'9'} , 'B':{'2':'8'}, 'C':{'3':'7'} , 'D':{'4':'6'}}
所以我已经解释了我认为这意味着什么,但我不确定如何继续。我尝试做类似
的事情
d = {w:{k:{x:y}}for w,k,x,y in zip(sound, a, b, c)}
其中 'sound' 是一个包含相同元素值的列表,但只打印出列表中的第 4 项。任何帮助解决这个问题的帮助将不胜感激。谢谢。
使用列表理解。迭代压缩列表并创建嵌套字典:
a = ['A', 'B', 'C', 'D']
b = [1, 2, 3, 4]
c = ['N1', 'N2', 'N3', 'N4']
>>> [{k1: {k2: v}} for k1, v, k2 in zip(a, b, c)]
[{'A': {'N1': 1}}, {'B': {'N2': 2}}, {'C': {'N3': 3}}, {'D': {'N4': 4}}]
@mhawke 的字典理解很好,但让我添加一个更天真的解决方案,可能需要了解如何实现这种类型的嵌套字典:
a = ['A', 'B', 'C', 'D']
b = [1, 2, 3, 4]
c = ['N1', 'N2', 'N3', 'N4']
output = [{'A': {'N1':1}}, {'B':{'N2':2}}, {'C':{'N3':3}}, {'D':{'N4':4}}]
def create_nested(a, b, c):
result = []
for i in range(len(a)):
parent = {}
child = {c[i]: b[i]}
parent.setdefault(a[i], child)
result.append(parent)
return result
result = create_nested(a, b, c)
print(result)
assert result == output
使用枚举
def create_nested(a, b, c):
result = []
for idx, value in enumerate(a):
child = {c[idx]: b[idx]}
parent = {a[idx]: child}
result.append(parent)
return result
缩写形式
for idx, value in enumerate(a):
parent = {a[idx]: {c[idx]: b[idx]}}
result.append(parent)
return result
这个问题和我在How to Create Nested Dictionary in Python with 3 lists
学到的另一个问题很相似如何从 3 个列表中获得如下输出形式的输出
a = ['A', 'B', 'C', 'D']
b = [1,2,3,4]
c = ['N1', 'N2', 'N3', N4]
output = [{'A': {'N1':1}}, {'B':{'N2':2}}, {'C':{'N3':3}}, {'D':{'N4':4}}]
输出与发布的内容不同 link。 如果我可以描述这个,我会说它是一本字典,其中 'N#' 是值 1-4 的关键字,而这些字典又具有关键字 'A'-'D',它们看起来都是成为一些未显示的顶级关键字中的字典,它们都是该主关键字的元素。
我使用了提供输出的这行代码。这些值与我使用的值不同,但重点是边缘处没有那么多大括号或方括号
d = {k: {x: y} for k, x, y in zip(a, b, c)}
# output: {'A':{'1' :'9'} , 'B':{'2':'8'}, 'C':{'3':'7'} , 'D':{'4':'6'}}
所以我已经解释了我认为这意味着什么,但我不确定如何继续。我尝试做类似
的事情d = {w:{k:{x:y}}for w,k,x,y in zip(sound, a, b, c)}
其中 'sound' 是一个包含相同元素值的列表,但只打印出列表中的第 4 项。任何帮助解决这个问题的帮助将不胜感激。谢谢。
使用列表理解。迭代压缩列表并创建嵌套字典:
a = ['A', 'B', 'C', 'D']
b = [1, 2, 3, 4]
c = ['N1', 'N2', 'N3', 'N4']
>>> [{k1: {k2: v}} for k1, v, k2 in zip(a, b, c)]
[{'A': {'N1': 1}}, {'B': {'N2': 2}}, {'C': {'N3': 3}}, {'D': {'N4': 4}}]
@mhawke 的字典理解很好,但让我添加一个更天真的解决方案,可能需要了解如何实现这种类型的嵌套字典:
a = ['A', 'B', 'C', 'D']
b = [1, 2, 3, 4]
c = ['N1', 'N2', 'N3', 'N4']
output = [{'A': {'N1':1}}, {'B':{'N2':2}}, {'C':{'N3':3}}, {'D':{'N4':4}}]
def create_nested(a, b, c):
result = []
for i in range(len(a)):
parent = {}
child = {c[i]: b[i]}
parent.setdefault(a[i], child)
result.append(parent)
return result
result = create_nested(a, b, c)
print(result)
assert result == output
使用枚举
def create_nested(a, b, c):
result = []
for idx, value in enumerate(a):
child = {c[idx]: b[idx]}
parent = {a[idx]: child}
result.append(parent)
return result
缩写形式
for idx, value in enumerate(a):
parent = {a[idx]: {c[idx]: b[idx]}}
result.append(parent)
return result