Python递归函数在Excel中转​​储树

时间:2014-02-13 16:21:28

标签: python django excel recursion

我在Django models.py文件中有一个非常简单的有向遍历图结构,它转换为以下两个Python类:

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文件中。 xlwt 可以轻松写入Excel文档 - 我可以使用简单的write(x, y, content)函数写入任何单元格 - 但我现在遇到的困难是通过整个树(递归地)并获取每个可能的路径以在Excel文件中写入。

考虑到我在第一个位置有3个节点(A1,A2,A3),每个节点都链接到第二个位置的一个节点(B1),最终链接到第三个位置的1个节点(C1),我会需要遍历所有可能的路径并将其转换为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

在前面提到的示例中,我有5个Node个实例和5个Edge个实例。

关于如何做到这一点的任何想法?

谢谢! Ĵ

1 个答案:

答案 0 :(得分: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>)]