首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中重新构建字典的层次结构?

在Python中重新构建字典的层次结构?
EN

Stack Overflow用户
提问于 2020-02-07 13:42:20
回答 3查看 185关注 0票数 2

如果我在Python中有一个嵌套的字典,有没有办法根据键重新构造它?

我不擅长解释,所以我举个小例子。

代码语言:javascript
复制
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]}}

像这样重新组织

代码语言:javascript
复制
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]}}

给定一些带有如下输入的函数

代码语言:javascript
复制
def mysteryfunc(olddict,newkeyorder):
    ????

mysteryfunc(d,[1,0])

其中,1,0列表通过的意思是将字典的第二级关键字放在第一级,第一级放在第二级。显然,这些值需要与它们的唯一键值相关联。

Edit:查找覆盖一般情况的答案,具有任意未知的嵌套字典深度。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-08 00:29:54

您可以使用带有生成器的递归来处理任意深度的输入:

代码语言:javascript
复制
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))))

输出:

代码语言:javascript
复制
{'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]}}
票数 1
EN

Stack Overflow用户

发布于 2020-02-07 17:47:21

输入:

代码语言:javascript
复制
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]}}

inner_dict={}
for k,v in d.items():
    print(k)
    for ka,va in v.items():
        val_list=[]
        if ka not in inner_dict:
            val_dict={}
            val_dict[k]=va
            inner_dict[ka]=val_dict
        else:
            val_dict=inner_dict[ka]
            val_dict[k]=va
            inner_dict[ka]=val_dict

输出:

代码语言:javascript
复制
{'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]}}
票数 4
EN

Stack Overflow用户

发布于 2020-02-07 16:00:47

您可以使用2个for循环,一个用于迭代每个键、值对,第二个for循环用于迭代嵌套的dict,在第二个for循环迭代的每一步,您都可以构建所需的输出:

代码语言:javascript
复制
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)) 

输出:

代码语言:javascript
复制
{'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]}}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60107720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档