2013-07-05 68 views
0

名單我有類型的字典列表看起來是這樣的:建築,父子依賴

list = [{'parent': u'#5963','id': 5962},{'parent': u'','id': 5963}, 
{'parent': u'#5963', 'id': 5964}, {'parent': u'#5966', 'id': 5967}, 
{'parent': u'#5963','id': 5966}, {'parent': u'#5962','id': 5968} ] 

實際類型的字典是一個有點複雜 - 他們有更多的鍵和值。

正如你所看到的 - 每個字典都有一個「父母」鍵,它告訴我們元素父母的ID和'ID'鍵。

現在的問題是:是否有可能建立一個新的列表(或排序這一個)的方式,所有的字母都是父母的方式?

所以新的字典將是:

[{'parent': u'','id': 5963},{'parent': u'#5963','id': 5962}, 
{'parent': u'#5962','id': 5968}, {'parent': u'#5963', 'id': 5964}, 
{'parent': u'#5963','id': 5966}, {'parent': u'#5966', 'id': 5967} ] 

PS:有可能沒有根元素
PPS(用「父」鍵=「」元素):父元素可以具有多於1-2級的兒童

+2

我不明白現在

您可以使用這兩個函數進行排序列表。 「親子方式」是什麼意思?或者另一個問題:你想完成什麼?我敢肯定,你可以使用樹來擺脫這些問題... – tamasgal

+0

由於SQL查詢,我得到第一個列表。然後它被傳遞給一個模板以建立一個表格。模板使用列表元素來創建表格的行。我現在需要的是 - 它以重新排列這個列表的方式,結果表將有一個層次結構,因此是父子方式。 – konart

回答

1

你不能這樣做,直接排序,首先從你的列表中建立一棵樹。您需要兩個信息:頂級節點列表中的樹和父母/子女關係(或者沒有父母或孩子與不存在的父節點):

def build_tree(l): 
    exists = set(map(lambda x : x['id'], l)) 

    tops = [] 
    children = {} 
    for e in l: 
     parent = e['parent'] 
     if not parent: 
      tops.append(e) 
      continue 

     parent = int(parent[1:]) 
     if parent not in exists: 
      tops.append(e) 
      continue 

     if parent in children: 
      children[parent].append(e) 
     else: 
      children[parent] = [ e ] 

    return children, tops 

然後做樹的深度優先遍歷用遞歸函數:

def build_list(children, top): 
    l = [ top ] 
    if top['id'] in children: 
     for child in children[top['id']]: 
      l += build_list(children, child) 
    return l 

第一個功能給你的孩子/關係結構,而第二個讓你建立對每個可能的頂部節點列表。如果刪除節點5963,這將使

l = [{'parent': u'#5963','id': 5962},{'parent': u'','id': 5963}, 
{'parent': u'#5963', 'id': 5964}, {'parent': u'#5966', 'id': 5967}, 
{'parent': u'#5963','id': 5966}, {'parent': u'#5962','id': 5968} ] 
children, tops = build_tree(l) 
for top in tops: 
    print build_list(children, top) 
# outputs : [{'id': 5963, 'parent': u''}, {'id': 5962, 'parent': u'#5963'}, 
# {'id': 5968, 'parent': u'#5962'}, {'id': 5964, 'parent': u'#5963'}, 
# {'id': 5966, 'parent': u'#5963'}, {'id': 5967, 'parent': u'#5966'}] 

[{'id': 5962, 'parent': u'#5963'}, {'id': 5968, 'parent': u'#5962'}] 
[{'id': 5964, 'parent': u'#5963'}] 
[{'id': 5966, 'parent': u'#5963'}, {'id': 5967, 'parent': u'#5966'}] 
+0

如果沒有頂級節點會怎麼樣? (沒有與'父母'鍵等於''的字典) – konart

+0

@konart我的當前代碼在這種情況下失敗,但是當沒有「父母」時數據看起來像什麼?是否因爲孩子參考非現有父母?或者你有父/子關係中的循環嗎? – Guillaume

+0

假設我們正在談論一些有票的時間跟蹤系統(一張票=一項任務)。每個任務可能有一些子任務。頂級任務可以由一個用戶擁有,但是由其他人來分。當頂層任務的所有者請求他擁有的任務時 - 他會得到與我的問題類似的列表,但是當列表僅由擁有子任務的用戶請求時,他將看到的列表將相同,頂級任務除外(代碼中的頂級節點)。所以所有的字典都會有一些父類,但是不會有單根。 – konart