首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表到嵌套字典

列表到嵌套字典
EN

Stack Overflow用户
提问于 2016-08-31 18:19:00
回答 1查看 102关注 0票数 2

我有像这样的关卡列表

代码语言:javascript
复制
levels = [["A", "B", "C", "D"], ["A", "B"], ["A", "B", "X"]]

作为响应,嵌套字典应如下所示

代码语言:javascript
复制
    {
    "name": "A", 
    "parent": -1, 
    "children": [
        {
            "name": "B", 
            "parent": "A", 
            "children": [
                {
                    "name": "C", 
                    "parent": "B", 
                    "children": [
                        {
                            "name": "D", 
                            "parent": "C", 
                        }
                    ], 

                }, 
                {
                    "name": "X", 
                    "parent": "B"
                }
            ], 

        }
    ]
}

我知道我在递归循环中遗漏了一些东西。

到目前为止,这是我的代码

代码语言:javascript
复制
import csv
import json

class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value

def master_tree(data, payload, parent = -1):
    if len(data) == 1:
        if data[0] not in payload['name']:
            payload = {'name':data[0], "parent": parent}
    else:
        if data[0] in payload['name']:
            for k in payload['children']:
                master_tree(data[1:], k, data[0])
        else:
            payload = {'name': data[1], "parent": data[0], 'children':[master_tree(data[1:], payload, data[0])]}

    return payload


payload = AutoVivification()
payload = master_tree(["A", "B", "X"], payload)
payload = master_tree(["A", "B", "C", "D"], payload)

print json.dumps(payload, indent=4)

当相同的结构重复时会出现问题。与A->B->C->D一样,D在第一次迭代时就已经存在,当A->B再次传递时,理想情况下它应该跳过它,在最后一种情况下,它应该只在B下添加X节点

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-02 00:57:19

代码语言:javascript
复制
import csv
import json

class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value

def master_tree(data, payload, parent = -1):
    if len(data) == 1:
        if data[0] not in payload['name']:
            payload = {'name':data[0], "parent": parent}
    else:
        if 'name' in payload and data[0] in payload['name']:
            get_list = []
            for k in payload['children']:
                get_list.append(k['name'])
            if data[1] in get_list:
                master_tree(data[1:], k, data[0])            
            else:
                payload['children'].append(master_tree(data[1:], {'name':data[0], "parent": parent}, data[0]))

        else:
            payload = {'name': data[0], "parent": parent, 'children':[master_tree(data[1:], payload, data[0])]}

    return payload


payload = AutoVivification()
payload = master_tree(["A", "B", "X"], payload)
payload = master_tree(["A", "B", "C", "D"], payload)
payload = master_tree(["A", "B", "Q"], payload)


print json.dumps(payload, indent=4)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39246906

复制
相关文章

相似问题

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