樹是我們常見的一種一對多的資料結構。
最近為了處理一些事情,寫了一顆三層的樹。每層的子節點數目均不確定,動態新增。
為了方便管理,寫成了巢狀樹。
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是中就只能開啟乙個任務管理器。如果不使用機制對視窗物件進行唯一化,將彈出多個視窗,如果這...