2016-08-31 157 views
2

我有一个像列表嵌套字典

levels = [["A", "B", "C", "D"], ["A", "B"], ["A", "B", "X"]] 

水平的列表在响应嵌套词典应该会出现像

{ 
    "name": "A", 
    "parent": -1, 
    "children": [ 
     { 
      "name": "B", 
      "parent": "A", 
      "children": [ 
       { 
        "name": "C", 
        "parent": "B", 
        "children": [ 
         { 
          "name": "D", 
          "parent": "C", 
         } 
        ], 

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

     } 
    ] 
} 

我知道我缺少在递归循环的东西。

到目前为止,这是我的代码时,重复相同的结构发生

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已经从第一次迭代开始出现,当A-> B再次通过时,它应该理想地跳过它并且在最后一种情况下它应该只加上X节点B

回答

1
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)