最近工作接觸到圖資料庫,圖和樹的儲存形式是一對對基本的指向關係。
當需要訪問時,不需要知道整體結構,只需要知道子節點,就可以把圖結構表示出來了。
出於好奇,這裡將這些基本的指向關係組成乙個完整的結構。
首先,我們把問題簡化,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...