首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pygraphviz或networkx:获取给定节点的所有子图的名称

pygraphviz或networkx:获取给定节点的所有子图的名称
EN

Stack Overflow用户
提问于 2020-04-16 03:14:13
回答 1查看 211关注 0票数 2

我想知道给定节点的子图结构。

我也可以使用networkx解决方案。

这是我的密码。

代码语言:javascript
复制
import pygraphviz as pgv

class Test:
    subgraph1 = 'foo'
    subgraph2 = 'bar'

    def __init__(self):
        self.G = pgv.AGraph(directed=True)
        self.G.add_subgraph(label=self.subgraph1, name='cluster_' + self.subgraph1)

        s1 = self.G.get_subgraph('cluster_' + self.subgraph1)
        s1.add_subgraph(label=self.subgraph2, name='cluster_' + self.subgraph2)
        s1.add_node('s1 node')

        s2 = s1.get_subgraph('cluster_' + self.subgraph2)
        s2.add_node('s2 node')

    def main(self):
        print(self.G.subgraph('1st node'))
        print(self.G.subgraph_parent('1st node'))
        print(self.G.subgraph_root('1st node'))
        n = self.G.get_node('1st node')
        print(n.attr['subgraph'])
        print(n.attr['label'])


if __name__ == '__main__': Test().main()

我想要一个函数,它将返回一个给定整个图中任何节点的子图列表。就像这样..。

In:subgraph_structure_as_list('s2 node')

Out:['foo', 'bar']

In:subgraph_structure_as_list('s1 node')

Out:['foo']

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-18 17:00:38

您可以使用这样的递归方法:

代码语言:javascript
复制
import pygraphviz as pgv

class Test:
    subgraph1 = 'foo'
    subgraph2 = 'bar'

    def __init__(self):
        self.structure = []
        self.G = pgv.AGraph(directed=True)
        self.G.add_subgraph(label=self.subgraph1, name='cluster_' + self.subgraph1)

        s1 = self.G.get_subgraph('cluster_' + self.subgraph1)
        s1.add_subgraph(label=self.subgraph2, name='cluster_' + self.subgraph2)
        s1.add_node('s1 node')

        s2 = s1.get_subgraph('cluster_' + self.subgraph2)
        s2.add_node('s2 node')

    #  ... other methods here ...

    def get_structure(self, node_name, node=None):
        if node is None:
            node = self.G
        for subgraph in node.subgraphs():
            if node_name in subgraph.nodes():
                self.structure.append(subgraph.node_attr['label'])
            self.get_structure(node_name, subgraph)

    def subgraph_structure_as_list(self, node_name):
        self.structure = []
        self.get_structure(node_name)
        return self.structure

您可以像这样使用subgraph_structure_as_list

代码语言:javascript
复制
a = Test()
print(a.subgraph_structure_as_list('s2 node'))
print(a.subgraph_structure_as_list('s1 node'))

输出:

代码语言:javascript
复制
['foo', 'bar']
['foo']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61242080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档