2014-02-13 25 views
0

我有一個非常簡單的定向穿越圖形結構在Django models.py文件轉換成以下兩個Python類:Python的遞歸函數來轉儲樹在Excel

class Node(models.Model): 
    position = models.IntegerField() # from 1 to 3 
    name = models.CharField(max_length=255) 
    value = models.FloatField(default=0.0) 

class Edge(models.Model): 
    source = models.ForeignKey("Node", related_name="__to") 
    destination = models.ForeignKey("Node", related_name="__from") 
    weight = models.FloatField(default=0.0) 

我需要轉儲的內容樹成Excel文件。寫入Excel文檔很容易,這要歸功於xlwt - 我可以使用簡單的write(x, y, content)函數寫入任何單元格 - 但我現在遇到的困難是遍歷整個樹(遞歸)並獲取每個可能的在Excel文件中寫入的路徑。考慮到我在第一位置具有3個節點(A1,A2,A3),每個節點鏈接到第二位置中的一個節點(B1),其最終鏈接到第三位置上的一個節點(C1),所以I將需要通過所有可能的路徑,並翻譯成Excel中的結構如下(是你的理解,但它實際上是Excel中的一個單獨的單元格):

Node A1 in position 1 <links to> Node B1 in position 2 <links to> Node C1 in position 3 
Node A2 in position 1 <links to> Node B1 in position 2 <links to> Node C1 in position 3 
Node A3 in position 1 <links to> Node B1 in position 2 <links to> Node C1 in position 3 

在上述例子中,我有Node 5個實例,以及Edge的5個實例。

在任何想法我怎麼能做到這一點?

謝謝! J

回答

0

嚴格地說,這是一個directed graph遍歷而不是有向樹。

一個簡單的算法,即忽略了edges但基於position,並給出了預期輸出是:

>>> positions = [Node.objects.filter(position=i) for i in range(1,3+1)] 
>>> import itertools 
>>> list(itertools.product(positions)) 

[(<Node: A1>, <Node: B1>, <Node: C1>), 
(<Node: A2>, <Node: B1>, <Node: C1>), 
(<Node: A3>, <Node: B1>, <Node: C1>)] 
+0

感謝擡起頭 - 我在樹上沒有專家...我的意思是,圖表。任何想法,我可以開始尋找解決原來的問題? – jlibioul

+0

我用一個簡單的算法編輯了我的答案 – arocks

+0

再次感謝您的時間。也許我沒有足夠清楚地解釋自己;我需要的是一種貫穿每條路徑的方式,並將在Excel文件的不同單元格中的特定路徑中使用的每個單節點的名稱寫入。最後,由於有三種可能的路徑,我想在Excel文檔中有3行不同的行,並且每行/路徑使用3列。你明白我的意思嗎? – jlibioul