在Python中重构字典的层次结构?
如果我有一个Python中的嵌套字典,有没有办法根据键来重新构造它 我不擅长解释,所以我举个小例子在Python中重构字典的层次结构?,python,dictionary,Python,Dictionary,如果我有一个Python中的嵌套字典,有没有办法根据键来重新构造它 我不擅长解释,所以我举个小例子 d = {'A':{'a':[1,2,3],'b':[3,4,5],'c':[6,7,8]}, 'B':{'a':[7,8,9],'b':[4,3,2],'d':[0,0,0]}} 像这样重新组织 newd = {'a':{'A':[1,2,3],'B':[7,8,9]}, 'b':{'A':[3,4,5],'B':[4,3,2]}, 'c':{'A':
d = {'A':{'a':[1,2,3],'b':[3,4,5],'c':[6,7,8]},
'B':{'a':[7,8,9],'b':[4,3,2],'d':[0,0,0]}}
像这样重新组织
newd = {'a':{'A':[1,2,3],'B':[7,8,9]},
'b':{'A':[3,4,5],'B':[4,3,2]},
'c':{'A':[6,7,8]},
'd':{'B':[0,0,0]}}
给定一些输入为
def mysteryfunc(olddict,newkeyorder):
????
mysteryfunc(d,[1,0])
其中通过的[1,0]列表意味着将字典第二级键置于第一级,将第一级键置于第二级。显然,这些值需要与其唯一的键值相关联
编辑:
寻找覆盖一般情况的答案,具有任意未知嵌套字典深度。您可以使用2个for循环,一个用于迭代每个键、值对,第二个for循环用于迭代嵌套dict,在每个步骤中形成第二个for循环迭代,您可以生成所需的输出:
from collections import defaultdict
new_dict = defaultdict(dict)
for k0, v0 in d.items():
for k1, v1 in v0.items():
new_dict[k1][k0] = v1
print(dict(new_dict))
输出:
{'a': {'A': [1, 2, 3], 'B': [7, 8, 9]},
'b': {'A': [3, 4, 5], 'B': [4, 3, 2]},
'c': {'A': [6, 7, 8]},
'd': {'B': [0, 0, 0]}}
输入:
输出:
{'a': {'A': [1, 2, 3], 'B': [7, 8, 9]},
'b': {'A': [3, 4, 5], 'B': [4, 3, 2]},
'c': {'A': [6, 7, 8]},
'd': {'B': [0, 0, 0]}}
{'a': {'A': [1, 2, 3], 'B': [7, 8, 9]}, 'b': {'A': [3, 4, 5], 'B': [4, 3, 2]}, 'c': {'A': [6, 7, 8]}, 'd': {'B': [0, 0, 0]}}
可以将递归与生成器一起使用,以处理任意深度的输入:
def paths(d, c = []):
for a, b in d.items():
yield from ([((c+[a])[::-1], b)] if not isinstance(b, dict) else paths(b, c+[a]))
from collections import defaultdict
def group(d):
_d = defaultdict(list)
for [a, *b], c in d:
_d[a].append([b, c])
return {a:b[-1][-1] if not b[0][0] else group(b) for a, b in _d.items()}
print(group(list(paths(d))))
输出:
{'a': {'A': [1, 2, 3], 'B': [7, 8, 9]},
'b': {'A': [3, 4, 5], 'B': [4, 3, 2]},
'c': {'A': [6, 7, 8]},
'd': {'B': [0, 0, 0]}}
{'a': {'A': [1, 2, 3], 'B': [7, 8, 9]}, 'b': {'A': [3, 4, 5], 'B': [4, 3, 2]}, 'c': {'A': [6, 7, 8]}, 'd': {'B': [0, 0, 0]}}
在您的编辑中,您是否可以解释一个更嵌套的字典会发生什么情况?同样在您的编辑中:如果您在不同级别拥有相同的键,会发生什么行为?