Python python實現樹結構

2021-08-21 09:03:09 字數 2196 閱讀 6531

樹是我們常見的一種一對多的資料結構。

最近為了處理一些事情,寫了一顆三層的樹。每層的子節點數目均不確定,動態新增。

為了方便管理,寫成了巢狀樹。

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):

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

else:

self.sum += 1

self.children_dict[value] = 1

#獲取根結點

def get_root(self):

return self.root

#獲取全部子節點

def get_children(self):

return self.children_dict

驅動python python實現事件驅動

eventmanager事件管理類實現,大概就百來行 左右。encoding utf 8 系統模組 from queue import queue,empty from threading import class eventmanager def init self 初始化事件管理器 事件物件列表...

快速排序菜鳥python python實現快速排序

python實現快速排序 快速排序 基本原理 選擇待排序列第乙個元素作為參照點,將列表分為左右兩個列表,左列表元素均比參照點小,右列表元素均比參照點大,然後遞迴左右兩個列表。coding utf 8 基本思想 選擇待排序列中乙個數字,將列表分為左右兩個列表,左邊比數小,右邊比數大。然後遞迴呼叫。de...

Python Python如何實現單例模式?

對於系統中的某些類來說,只有乙個例項很重要,例如,乙個系統中可以存在多個列印任務,但是只能有乙個正在列印的任務 乙個系統中只能有乙個串列埠管理器或檔案系統 乙個系統只能有乙個計時工具或id生成器。如在window是中就只能開啟乙個任務管理器。如果不使用機制對視窗物件進行唯一化,將彈出多個視窗,如果這...