2013-03-15 96 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() 

       cmap = {} 
       for row in rows: 
        cmap[row[0]] = row[2] 
       hrcy={} 
       for level in range(1, maxl + 1): 
        for row in rows: 
         if row[1] == level: 
          if hrcy == {}: 
           hrcy[row[2]] = [] 
           continue 
          parent = cmap[row[3]] 
          hrcy[parent].append({ row[2]: [] }) 

我面臨的問題是節點超過第二級,它們正在增加而不是他們的父母;我應該在哪裏做代碼中的更改?

回答

2

問題在於,插入它們後無法直接看到第二級的節點。試試這個:

conx = sqlite3.connect('nameofdatabase.db') 
curs = conx.cursor() 
curs.execute('SELECT COMPONENT_ID, LEVEL, COMPONENT_NAME, PARENT ' + 
       'FROM DOMAIN_HIERARCHY') 
rows = curs.fetchall() 
cmap = {} 
hrcy = None 
for row in rows: 
    entry = (row[2], {}) 
    cmap[row[0]] = entry 
    if row[1] == 1: 
     hrcy = {entry[0]: entry[1]} 

# raise if hrcy is None 

for row in rows: 
    item = cmap[row[0]] 
    parent = cmap.get(row[3], None) 
    if parent is not None: 
     parent[1][row[2]] = item[1] 

print hrcy 

通過保持每個組件的子組件的地圖在cmap,我總是可以達到每個家長的映射下一個組件添加到它。我用下面的測試數據試了一下:

rows = [(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)]  

輸出是這樣的:

{'A': {'AA': {'AAA': {}, 'AAB': {}}, 'AB': {'ABA': {}, 'ABB': {}}}} 
+0

這工作!非常感謝Don Kriby :) – Praneeth 2013-03-15 06:20:13

相關問題