2014-11-13 49 views
0

我想弄清楚如何將表示分層數據的錶轉換回代碼。如何從平面關係表中重新組合分層數據?

在該表中列示:

| id | parent_id | name | 
|----|-----------|------| 
| 1 | null | foo | 
| 2 | 1  | bar | 
| 3 | 1  | baz | 
| 4 | 3  | bif | 
| 5 | 1  | zip | 

etc... 

使得重建的時候,它看起來像這樣:

foo 
|-bar 
|-baz 
    |-bif 
|-zip 

我苦苦尋找建立這個非可怕的方式在內存中列出。

基本上,我剛纔所說的解決方案只是強制我的方式。例如(在僞Python中)

output = {} 
for item in table: 
    parent = get_parent(item) 
    if parent: 
     if parent not in output: 
      output[parent] = [] 
     output[parent_item].append(item) 

但是,這隻會讓我感到一半。它正確地把孩子貼在他們的直系親屬身上,但只有一個等級。這些數據大概有3層,所以我想我不得不對它迭代,直到找不到更多的父對象。

只要說,我的解決方案是壞的,脆弱的,我不知道還有什麼要做。什麼是解決這個問題的正確方法?

回答

0

檢查此快速解決方案。

我們可以建立一個字典,所以我們可以將鍵映射到名稱。

D={"1":"foo","2":"bar","3":"baz","4":"bif","5":"zip","Non":'Root'} 
get_parent_id=["Non","1","1","3","1"] 
get_name=["foo","bar","baz","bif","zip"] 

result = {} 
for k,v in zip(get_parent_id,get_name): 
    result.setdefault(D[k], {}).update({v:{}}) 

我們建立了一個字典,從parent ids和名字。

{'baz': {'bif': {}}, 'foo': {'baz': {}, 'bar': {}, 'zip': {}}, 'Root': {'foo': {}}} 

現在,我們必須研究其他值。我們可以使用布爾型字典{key:boolean value}來標記哪裏是根,每當我們找到一個關鍵值時,我們將它標記爲false,因爲它不可能是根。

正式,Root是沒有出現在所有鍵的值中的鍵。

boolRoot= len(result)*[True] 
bDict=dict(zip(result.keys(),boolRoot)) 

# {'Root': True, 'foo': True, 'baz': True} 

然後,我們遍歷價值觀,我們替換裏面用鑰匙將其價值觀和映射到兒童

for k,v in result.iteritems(): 
    for item in v.keys(): 
     #print item,result[k][item] 
     if item in result.keys(): 
      bDict[item]=False 
      result[k][item]=result[item] 

print result 
print bDict 

在年底的價值觀,我們將有:

{'baz': {'bif': {}}, 'foo': {'baz': {'bif': {}}, 'bar': {}, 'zip': {}}, 'Root': {'foo': {'baz': {'bif': {}}, 'bar': {}, 'zip': {}}}} #result 
{'Root': True, 'foo': False, 'baz': False} #bDict 

Root是基於上述假設的值爲True的關鍵字。您只需要獲得result[name],其中bDict[name] is True

希望它能幫助您找到更好的解決方案。

相關問題