簡體   English   中英

如何從 Python 中的分層數據創建樹結構?

[英]How to create tree structure from hierarchical data in Python?

嗨,我對 Python 有點陌生,對如何進行有點困惑。 我有一個包含父子信息的大型數據集。 例如,如果我們有各種項目及其組件,而它們的組件也有其他組件或子組件,我們如何創建一種樹結構? 下面是一個數據示例: 在此處輸入圖片說明

我想知道如何將它變成樹狀結構。 所以輸出將是:

汽車樹結構

並且它也會返回一個用於飛機的,類似於用於汽車的一個。

我知道這的共同屬性將基於父編號/子編號。 但是,我對如何在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM