2013-03-26 26 views
1

我有一個數據庫表,如下所示。該數據是在樹與在Python字典中有一個嵌套列表

  CREATE TABLE IF NOT EXISTS DOMAIN_HIERARCHY (
       COMPONENT_ID  INT    NOT NULL , 
       LEVEL    INT    NOT NULL , 
       COMPONENT_NAME  VARCHAR(127) NOT NULL , 
       PARENT    INT    NOT NULL , 
       PRIMARY KEY (COMPONENT_ID) 
       ); 

下面的數據是在表中的形式

   (1,1,'A',0) 
       (2,2,'AA',1) 
       (3,2,'AB',1) 
       (4,3,'AAA',2) 
       (5,3,'AAB',2) 
       (6,3,'ABA',3) 
       (7,3,'ABB',3) 

我必須找回在Python字典

在下面的數據和存儲代碼

   conx = sqlite3.connect('nameofdatabase.db') 
       curs = conx.cursor() 
       curs.execute('SELECT COMPONENT_ID, LEVEL, COMPONENT_NAME, PARENT FROM DOMAIN_HIERARCHY') 
       rows = curs.fetchall()      
       hrcy = {}     
       for row in rows: 
        entry = (row[2], {}) 
        cmap[row[0]] = entry 
        if row[1] == 1: 
         hrcy = {entry[0]: entry[1]} 
         hrcy['status'] = 0 
       for row in rows: 
        item = cmap[row[0]] 
        parent = cmap.get(row[3], None) 
        if parent: 
         parent[1][row[2]] = item[1] 
         parent[1]['status'] = 0 
       print json.dumps(hrcy, indent = 4) 

輸出是像

   { 
        "status": 0, 
        "A": { 
         "status": 0, 
         "AA": { 
          "status": 0, 
          "AAA": {}, 
          "AAB": {} 
         }, 
         "AB": { 
          "status": 0, 
          "ABA": {}, 
          "ABB": {} 
         } 
        } 
       } 

我要像

   { 
        "component": "A", 
        "status": 0, 
        "children": [ 
         { 
          "component": "AA", 
          "status": 0, 
          "children": [ 
           { 
            "component": "AAA", 
            "status": 0, 
            "children": [] 
           }, 
           { 
            "component": "AAB", 
            "status": 0, 
            "children": [] 
           } 
          ] 
         }, 
         { 
          "component": "AB", 
          "status": 0, 
          "children": [ 
           { 
            "component": "ABA", 
            "status": 0, 
            "children": [] 
           }, 
           { 
            "component": "ABB", 
            "status": 0, 
            "children": [] 
           } 
          ] 
         } 
        ] 
       } 

輸出誰能告訴什麼樣的變化,我應該做什麼呢?

回答

1

剛剛建立,而不是別的東西,你想要的類型的字典,:

for row in rows: 
    entry = {"component": row[2], 
      "children": [], 
      "status": 0} 
    cmap[row[0]] = entry 
    if row[1] == 1: 
     hrcy = entry 
for row in rows: 
    item = cmap[row[0]] 
    parent = cmap.get(row[3], None) 
    if parent: 
     parent["children"].append(item) 
+0

不敢相信這簡單的小代碼解決了我的「無法解決」的問題謝謝你Janne Karela – Praneeth 2013-03-26 08:45:18

1

我會選擇這樣的事情:

import pprint 

class Node(dict): 
    def __init__(self, *args): 
     dict.__init__(self) 
     self['id'] = args[0] 
     self['group'] = args[1] 
     self['component'] = args[2] 
     self['parent'] = args[3] 
     self['status'] = 0 
     self['children'] = [] 

    def add_node(self, node): 
     for child in self['children']: 
      if child.is_parent(node): 
       child.add_node(node) 
       break 
     else: 
      self['children'].append(node) 

    def is_parent(self, node): 
     return node['component'].startswith(self['component']) 

class RootNode(Node): 
    def __init__(self): 
     Node.__init__(self, *[0, 0, "Root", -1]) 

    def is_parent(self, node): 
     return True 

def make_tree(nodes): 
    root = RootNode() 
    for data in nodes: 
     node = Node(*data) 
     root.add_node(node) 
    return root 

nodes = [ 
     (1, 1, 'A', 0), 
     (2, 2, 'AA', 1), 
     (3, 2, 'AB', 1), 
     (4, 3, 'AAA', 2), 
     (5, 3, 'AAB', 2), 
     (6, 3, 'ABA', 3), 
     (7, 3, 'ABB', 3), 
     ] 

if __name__ == "__main__": 
    tree = make_tree(nodes) 
    pprint.pprint(tree['children'][0]) 

OUTOUT

{'children': [{'children': [{'children': [], 
          'component': 'AAA', 
          'group': 3, 
          'id': 4, 
          'parent': 2, 
          'status': 0}, 
          {'children': [], 
          'component': 'AAB', 
          'group': 3, 
          'id': 5, 
          'parent': 2, 
          'status': 0}], 
       'component': 'AA', 
       'group': 2, 
       'id': 2, 
       'parent': 1, 
       'status': 0}, 
       {'children': [{'children': [], 
          'component': 'ABA', 
          'group': 3, 
          'id': 6, 
          'parent': 3, 
          'status': 0}, 
          {'children': [], 
          'component': 'ABB', 
          'group': 3, 
          'id': 7, 
          'parent': 3, 
          'status': 0}], 
       'component': 'AB', 
       'group': 2, 
       'id': 3, 
       'parent': 1, 
       'status': 0}], 
'component': 'A', 
'group': 1, 
'id': 1, 
'parent': 0, 
'status': 0}