[英]How to create tree structure from hierarchical data in Python?
使用類對結構進行編碼:
class TreeNode:
def __init__(self, number, name):
self.number = number
self.name = name
self.children = []
def addChild(self, child):
self.children.append(child)
如何使用它的一個例子:
car = TreeNode(1111, "car")
engine = TreeNode(3333, "engine")
car.addChild(engine)
注意: number
屬性不必是整數(例如,汽車為1111
); 它也可以是一個整數字符串(即"1111"
)。
要真正獲得類似於您想要的輸出的內容,我們需要將根對象序列化為嵌套字典:
class TreeNode:
def __init__(self, number, name):
self.number = number
self.name = name
self.children = []
def addChild(self, child):
self.children.append(child)
def serialize(self):
s = {}
for child in self.children:
s[child.name] = child.serialize()
return s
現在,我們可以使用json.dumps
獲得類似於您想要的輸出的json.dumps
:
dummy = TreeNode(None, None) # think of this as the root/table
car = TreeNode(1111, "car")
dummy.addChild(car)
engine = TreeNode(3333, "engine")
car.addChild(engine)
fan = TreeNode(4312, "fan")
engine.addChild(fan)
print(json.dumps(dummy.serialize(), indent=4))
印刷:
{
"car": {
"engine": {
"fan": {}
}
}
}
像這樣的問題總是歸結為算法和數據集。 我注意到你的數據集的第一件事是它的排序是這樣的,沒有孩子是前一個父母的父母。 換句話說,項目以“自上而下”的方式列出。 這總是正確的嗎? 如果是,則意味着算法的邏輯變得簡單得多。
另一個考慮因素是數據結構。 我會使用嵌套字典來保存這里的主要數據集。 每個新的唯一父項將是主字典的“鍵”。 與該鍵對應的每個“值”將是一個 dict,並且可以根據需要繼續嵌套。 在這種情況下,只會有很少的嵌套級別。
因此,對於數據集中的每一行,您將檢查 Parent 是否顯示為頂部 dict 或任何嵌套 dict 中的鍵。 如果沒有,您將在頂級字典中創建一個新條目,以 Parent 作為鍵,{Child:{}} 作為新條目的值。 (這將發生在“汽車”和“飛機”上。)
如果當前 Parent 確實在任何 dicts 中顯示為鍵,則需要將 Child 值作為新鍵添加到 dict 中,該 dict 是 Parent 作為鍵的 dict 的值。 在這種情況下,Child 是新鍵,該鍵的值是空字典 {}。
以上是我用來編寫代碼的粗略邏輯。 我把那部分留給你。 您可能可以使用第三方庫來減少工作量,但如果您正在上課並且這是一項作業,您的老師可能不希望您使用此類外部庫。
請注意,上述邏輯假設數據集是按“自上而下”的方式組織的。 如果不是這種情況,那么邏輯會變得更加復雜,並且如果在數據集中處理該子級的新父級,則當前處於層次結構中某個級別的鍵可能會在層次結構中向下移動。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.