python 從零散的字典組裝成樹狀巢狀字典

2021-10-08 10:25:53 字數 3012 閱讀 1889

最近工作接觸到圖資料庫,圖和樹的儲存形式是一對對基本的指向關係。

當需要訪問時,不需要知道整體結構,只需要知道子節點,就可以把圖結構表示出來了。

出於好奇,這裡將這些基本的指向關係組成乙個完整的結構。

首先,我們把問題簡化,python中最基本的表示關係的資料結構是字典,

假設有這樣一組關係,我們把它們用字典表示:

dict_list =[,

,,,,,,]

組成樹的過程分成三步:

1.找根節點

2.找出所有節點的子節點

3.深度優先遍歷(或廣度優先遍歷)組裝成最終的樹

說明:不能用這種方式生成字首樹(trie),因為在字首樹中,相同字母是可以重複出現在不同位置的,而在這裡乙個字母只能出現在乙個地方,在知識圖譜中比較適用。

我們先把根節點找出來,找根的依據是它沒有在值**現過,只能出現在鍵裡:

# 首先,找根節點的方法

possible_root =

set(

)impossible_root =

set(

)for d in dict_list:

possible_root |

= d.keys(

)# 根節點只能在鍵裡

impossible_root |

=set

(d.values())

# 值一定不是根節點

# 既是鍵又不是值,只能是根,由於只有乙個根,剩下的就只有乙個根節點

root_set = possible_root - impossible_root

# 既是值又沒有作為鍵出現過,說明沒有節點在它之後,就是葉子節點

leaf_set = impossible_root - possible_root

看看結果:

print

("root_set: "

, root_set)

print

("leaf_set: "

, leaf_set)

成功找到根a:

由於我們目標是組裝成完整的樹,因此要把各節點的所有子節點都找出來:

group =

for d in dict_list:

for k, v in d.items():

group.setdefault(k,

) group[k]

print

(group)

結果:

有了group這個資訊,就可以把完整的巢狀字典拼出來了:

def

dfs(temp, sub_tree)

:for r in temp:

children = group.get(r)

if children is

none

:return

sub_tree[r]

=for child in children:

sub_tree[r]

[child]

= dfs(

, sub_tree[r]

)result =

# 從root開始

dfs(root_set, sub_tree=result)

print

(result)

結果:

完整**:

from pprint import pprint

dict_list =[,

,,,,

,,]# 首先,找根節點的方法

possible_root =

set(

)impossible_root =

set(

)for d in dict_list:

possible_root |

= d.keys(

)# 根節點只能在鍵裡

impossible_root |

=set

(d.values())

# 值一定不是根節點

# 既是鍵又不是值,只能是根,由於只有乙個根,剩下的就只有乙個根節點

root_set = possible_root - impossible_root

# 既是值又沒有作為鍵出現過,說明沒有節點在它之後,就是葉子節點

leaf_set = impossible_root - possible_root

print

("root_set: "

, root_set)

print

("leaf_set: "

, leaf_set)

group =

for d in dict_list:

for k, v in d.items():

group.setdefault(k,

) group[k]

pprint(group)

defdfs

(temp, sub_tree)

:for r in temp:

children = group.get(r)

if children is

none

:return

sub_tree[r]

=for child in children:

sub_tree[r]

[child]

= dfs(

, sub_tree[r]

)result =

# 從root開始

dfs(root_set, sub_tree=result)

pprint(result)

Python 零散知識

1.set 集合 2.格式化字串時 可以使用 元組 eg info zhangsan 18 print s 年齡是 d info 3.zip的 使用方法 a 1,2,3 b 4,5,6 c 4,5,6,7,8 zipped zip a,b 打包為元組的列表 1,4 2,5 3,6 zip a,c 元...

零散的感想

全職英語學習已經兩周多了,馬上就三周了。這段時間的學習讓我變的很 懶 表現 計算機的學習由開始的每天學一點,發展到一點不學,到現在的不想看。靜下心來想想,這都是自己的問題,時間安排的不合理。應該每天都拿出點時間,乙個番茄的時間來溫習一下計算機,或者就不會太生疏,現在也不會糾結。乙個人不可能就幹一件事...

python零散知識點

請看如下知識 python為string物件提供了轉換大小寫的方法 upper 和 lower 還不止這些,python還為我們提供了首字母大寫,其餘小寫的capitalize 方法,以及所有單詞首字母大寫,其餘小寫的title 方法。a hello everyone a hello everyon...