Python基礎:python實現樹結構
阿新 • • 發佈:2018-11-05
樹是我們常見的一種一對多的資料結構。
最近為了處理一些事情,寫了一顆三層的樹。每層的子節點數目均不確定,動態新增。
為了方便管理,寫成了巢狀樹。
class ModelTree():
#第一層樹,建立樹是必須指定根結點,不支援建立空樹。
#整顆樹儲存在tree_dict中,key為root,value為children_dict
#children_dict中儲存所有的子節點,個數不確定,動態新增
def __init__(self, root):
self.tree_dict = {}
self.children_dict = {}
self.root = root
self.tree_dict[self.root] = self.children_dict
#獲取根結點的方法
def get_root(self):
return self.root
#新增子節點
def add_child(self, *args):
#子節點中儲存兩個值,屬性名稱attr和對應的屬性子樹物件attrObj
attr = args[0]
value = args[1]
#如果已經有某顆屬性子樹,則獲取attrObj物件,新增新的value值
if attr in self.children_dict.keys():
attrObj = self.children_dict[attr]
attrObj.add_value_child(value)
#否則建立一顆新的子樹
else:
attrObj = AttributeChildTree(attr)
attrObj.add_value_child(value)
self.children_dict[attr] = (attrObj)
#獲取某顆特定子樹的物件
def get_single_child(self, attr):
return self.children_dict[attr]
#獲取所有子樹/子節點
def get_all_children(self):
return self.children_dict
#獲取整顆樹
def get_tree(self):
return self.tree_dict
#第二層,屬性子樹
class AttributeChildTree():
#初始化方法,建立樹時必須指定根結點,不允許建立空樹,根結點的值為屬性名稱
#children_dict儲存所有的子節點,子節點包括兩個值,一個是該屬性的某個值,一個是該值出現的次數
#屬性子樹中的sum值,統計該子樹一共獲取了多少個值,方便之後根據該值計算每個值出現的頻率
def __init__(self, root):
# root is attr, children are value-frequency pairs
self.root = root
self.value_dict = {}
self.children_dict = {}
self.sum = 0
#該方法在整顆樹都建立完成之後,所有子節點都新增完畢之後呼叫。
#當然沒有新增完畢,也可以達到同樣的效果。將把子節點中儲存的count值替換為frequency
def __refresh__(self):
# call this function after all the attributes added, will refresh apperance to frequency
for value, apperance in self.children_dict.items():
frequency = round(apperance/self.sum,4)
self.children_dict[value] = frequency
#增加子節點,如果已經存在某個value,count+1,否則建立新的value子樹。每增加一個value,sum+1
def add_value_child(self, value):
if value in self.children_dict.keys():
self.sum += 1
self.children_dict[value] += 1 # apperance +1
else:
self.sum += 1
self.children_dict[value] = 1
#獲取根結點
def get_root(self):
return self.root
#獲取全部子節點
def get_children(self):
return self.children_dict