Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中重构字典的层次结构?_Python_Dictionary - Fatal编程技术网

在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':

如果我有一个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':[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]}}

在您的编辑中,您是否可以解释一个更嵌套的字典会发生什么情况?同样在您的编辑中:如果您在不同级别拥有相同的键,会发生什么行为?