Python:用节点和圆弧中的数据构建树

Python:用节点和圆弧中的数据构建树,python,tree,Python,Tree,我试图用节点和弧中的数据构建一棵树。到目前为止,我所做的是构建类树、弧和节点,如下所示: class Tree(): def __init__(self): self.root = None self.nodes = {} self.end_arcs = {} class Arc(): def __init__(self,start,end,data={}): self.start = start self.end = end sel

我试图用节点和弧中的数据构建一棵树。到目前为止,我所做的是构建类树、弧和节点,如下所示:

class Tree():

  def __init__(self):
    self.root = None
    self.nodes = {}
    self.end_arcs = {}

class Arc():

  def __init__(self,start,end,data={}):
    self.start = start
    self.end = end
    self.data = data

class Node():

  def __init__(self,token,data={}):
    self.token = str(token)
    self.state = self.OPEN
    self.data = data
节点编号越来越多,末端节点标记为-1。然而,当我想要反转树并重新编号节点时,我必须改变很多事情:节点的键dict,每个节点的标签,也许(或者它们可以指向节点dict中的节点?)还有弧dict中的节点。所以我认为我实现这种通用结构的方法不是一种好方法。有解决这个问题的标准方法吗?或者,您将如何构建这样的树结构

提前感谢,


Joris

< P>我的评论有一点扩展,请考虑下面的

class Tree():
  def __init__(self):
    self.root = None
    self.nodes = {}
    self.end_arcs = {}

class Arc():
  def __init__(self,start,end,data={}):
    self.start = start
    self.end = end
    self.data = data

  def __str__(self):
    return "%s-%s" % (self.start.token, self.end.token)

class Node():
  def __init__(self,token,data={}):
    self.token = str(token)
    #self.state = self.OPEN
    self.data = data


n1 = Node(1)
n2 = Node(2)
n3 = Node(3)
n4 = Node(4)
n5 = Node(5)

t = Tree()
t.root = n1
t.nodes = [n1,n2,n3,n4,n5]

a1 = Arc(n1,n2)
a2 = Arc(n2,n3)
a3 = Arc(n2,n4)
a4 = Arc(n1,n5)

print(a1)  # 1-2
# "Rename" Nodes
n1.token = 101 
n2.token = 102
print(a1)  # 101-102

“重命名”节点没有问题,因为arc“通过引用”跟踪节点,而不是通过其ID。例如,当我们查看arc时,使用引用允许我们不关心基础节点是如何更改的。

除非您想自己实现此图形基础设施,请查看。它是一个功能完整的图形/网络库,易于入门

import networkx as nx

class Node(object):
    def __init__(self, data):
        self.data = data

G = nx.Graph()
G.add_nodes_from([Node(1), Node(2), Node(3), Node(4)])
G.add_edge(1, 2, data='some data')
G.add_edge(2, 3, data='some more data')
G.add_edge(2, 4, data='yet more data')
这将创建一个如下所示的图形

  1
  |
  2
 / \
/   \
|   |
3   4

您不需要为节点使用自定义类。您可以简单地使用字符串、整数等(任何可哈希对象)。

您的弧端点是节点(节点对象)还是节点ID?听起来像是在存储节点ID。您可以考虑存储节点引用。我正在存储节点。我对Python非常陌生,这是否意味着如果我更改节点中的节点,我的弧中的节点也会自动更改(通过引用传递)?如果粘贴更多代码,我们可以回答这个问题。当你“在node dict中更改node”时,并不清楚你在做什么,所以很难说。这很好,不用担心一件事:-)。我注意到您将节点存储在一个列表中。这难道不意味着很难通过代币找到他们吗?或者,是否要在所有节点上循环以找到要查找的节点?这就是我使用dict的原因,但当然,现在令牌也存储为密钥,这会占用更多内存,而且更难更改令牌……将它们存储在字典中的问题是,每次更新令牌时都需要更新字典密钥。当然,您可以这样做,例如通过创建一个
set\u token()
方法来更新令牌和字典键。如果您经常这样做或者有很多节点,那么这可能是比搜索整个节点列表更好的方法。否则,“手动”搜索列表就没什么大不了的了。因为我使用的是相当大的树,所以我会选择字典。重置键并不是那么简单(似乎你必须完全重建你的dict?!),但我想这是离题了。无论如何谢谢你!如何评估树路径?1,2,3和1,2,4哪个函数生成路径