簡體   English   中英

根據兩個列表中指定的規則創建字典字典

[英]Create dictionary of dictionaries from rules specified in two lists

我正在進行一項涉及查找樹結構高度的練習,其中樹是根據兩個列表中指定的規則構建的。

我得到了一個成功找到高度的解決方案。 但是,我不得不手動創建樹,因為我正在努力尋找一種使用 python 構建樹的方法。

本質上,我想創建一個動態解決方案來構建遵循樹結構的字典。

可以從兩個列表中獲取構建字典的規則,如下所示:

a = [0,1,2,3,4]

b = [4,-1,4,1,1]

列表 a 是字典鍵值

列表 b 指定來自 b 的鍵在字典層次結構中的位置

規則

我們可以從列表 b 中 -1 的 position 中獲取字典的根鍵。 在列表 b 中,值 -1 位於索引 1。因此,根鍵是列表 a (1) 中索引 1 處的值:

dic[1] = {}

可以通過在列表 b 中查找根鍵 (1) 的實例的索引來獲取層次結構中的下一個鍵。 由於根鍵是 1 並且 1 在列表 b 中的索引 3 和 4 處,因此下一個鍵將在列表 a 中的索引 3 和 4 處(3 和 4):

迪克[1][3]

迪克[1][4]

通過在列表 b 中查找鍵 3 和 4,可以以相同的方式獲取層次結構中的下一個鍵。 因為鍵 4 位於列表 b 中的索引 0 和索引 2,因此下一個鍵將位於列表 a 中的索引 0 和索引 2(值 0 和 2 ),它們將位於層次結構中的鍵 4 下:

dic[1][4][0]

迪克[1][4][2]

因為 3 沒有出現在列表 b 中,所以它只包含一個空字典。

最后,我們將有以下字典:

dic = {1: {3: {}, 4: {0: {}, 2: {}}}}

有人可以建議一個創建字典的動態解決方案,可以從類似於上述的其他列表構建嗎?

我已經嘗試過使用遞歸的解決方案,但一直失敗。

所以,我打開了一個 ipython session 並開始胡鬧。 顯然,a 和 b 是相關的,所以我將它們壓縮,list(zip(a,b))。 由於 b 是層次結構,a 是字典的鍵,所以我將它們顛倒過來,list(zip(b,a))。 因為,-1 是特殊的,所以我想對此進行排序,sorted(zip(b,a))。 這看起來很接近我們想要的,但我們不知道會有多少重復,所以我把它改成了字典,可能有更好的代碼,但我這樣做了。

d = {k:[i for i,j in zip(a,b) if k==j] for k in set(b)} 

現在有了這個,我們實際上可以看到如何構建你的字典。 例如,d[-1] 返回 [1],因此,d[-1][0] 將是下一級的關鍵,因此我們將執行 d[d[-1][0]] 來獲得下一組鍵。 這將繼續,如 d[d[d[-1][0]][1]]。 因此看起來我們需要一個遞歸的 function 來不斷地訪問這個字典,如果鍵不存在則返回一個空字典。 就像是:

d = {k:[i for i,j in zip(a,b) if k==j] for k in set(b)}
def f(k):
    return {i:f(i) for i in d.get(k,{})} 
answer = f(-1)

沒有嘗試簡化此代碼。

您可以使用中間鏈接字典和單次通過父子關系來構建字典:

a = ["0","1","2","3","4"] 
b = [4,-1,4,1,1]

links = { key:{} for key in a }
tree  = links[None] = dict()
for child,parent in enumerate(b):
    childKey  = a[child]
    parentKey = None if parent < 0 else a[parent]
    links[parentKey].update({childKey:links[childKey]})

output:

print(tree)

# {'1': {'3': {}, '4': {'0': {}, '2': {}}}}

注意:我使用字符串而a數字來更好地區分索引和值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM