首页 > 解决方案 > 如何使用python igraph获取节点“有序”列表

问题描述

我的代码:

from igraph import Graph, plot

g = Graph(directed=True)

g.add_vertices("A", attributes=dict(operation="-"))

g.add_vertices("B", attributes=dict(operation="*"))
g.add_vertices("C", attributes=dict(operation=4))
g.add_vertices("D", attributes=dict(operation=8))

g.add_vertices("E", attributes=dict(operation="/"))
g.add_vertices("F", attributes=dict(operation=10))
g.add_vertices("G", attributes=dict(operation=2))

g.add_edges((("A", "B"), ("A", "E")))
g.add_edges((("B", "C"), ("B", "D")))
g.add_edges((("E", "F"), ("E", "G")))

io = [v['operation'] for v in g.vs]
print(*io)

产量

- * 4 8 / 10 2

我想

4 * 8 - 10 / 2

我在这里搜索了手册: docs

(这是绘制图表的图像,以帮助可视化问题。)

在此处输入图像描述

标签: pythonigraph

解决方案


我建议使用显式的左侧或右侧注释来增加边缘。

g.add_edges([("A", "B"), ("A", "E")], attributes={"side": ["L", "R"]})

从根节点开始,您可以递归地构造其左右手字符串并将它们连接起来,如下所示(未经测试)。

def ordered(g, node) -> str:
    edges = g.adjacent(node) # uses mode=OUT by default
    if len(edges) == 2:
        lhs = next(edge.target_vertex for edge in edges if edge["side"] == "L")
        rhs = next(edge.target_vertex for edge in edges if edge["side"] == "R")
        return ordered(g, lhs) + node["operation"] + ordered(g, rhs)
    else:
        return node['operation']

推荐阅读