【问题标题】:Length of All Paths In A List Using NetworkX使用 NetworkX 的列表中所有路径的长度
【发布时间】:2016-03-13 20:54:54
【问题描述】:

我需要一些关于图表的帮助。我使用模块 NetworkX,但了解它的所有内容并不重要。我是 Python 的初学者。我开始创建一个普通的图表:

import networkx as nx

G = nx.Graph()

G.add_edge("Node1","Node2",length=140,sf=4)
G.add_edge("Node2","Node3",length=170,sf=3)
G.add_edge("Node1","Node4",length=300,sf=1)
G.add_edge("Node4","Node3",length=230,sf=10)

x = input('First Node: ')
y = input('Second Node: ')

paths = sorted(nx.all_simple_paths(G,x,y))

print(paths)

我添加了 2 个属性:长度和 sf(我稍后会用到)。我运行了这个程序并得到了 Node1 和 Node3 这个:

[['Node1', 'Node2', 'Node3'], ['Node1', 'Node4', 'Node3']]

如何计算路径的长度?而且我需要将长度与属性“sf”相乘。我把问题简化了,因为后来我有几百个节点,所以会比较困难。

我开始考虑一个 for 函数,但我得到了错误。

【问题讨论】:

    标签: python


    【解决方案1】:

    你可以使用for-loop:

    import sys
    import networkx as nx
    
    G = nx.Graph()
    
    G.add_edge("Node1", "Node2", length=140, sf=4)
    G.add_edge("Node2", "Node3", length=170, sf=3)
    G.add_edge("Node1", "Node4", length=300, sf=1)
    G.add_edge("Node4", "Node3", length=230, sf=10)
    
    x, y = sys.argv[-2:]
    paths = sorted(nx.all_simple_paths(G, x, y))
    
    for path in paths:
        total_length = 0
        for i in range(len(path)-1):
            source, target = path[i], path[i+1]
            edge = G[source][target]
            length = edge['length']*edge['sf']
            total_length += length
        print('{}: {}'.format(path, total_length))
    

    或者,更简洁地说,您可以将内部 for-loop 替换为 generator expression

    import operator
    length_sf = operator.itemgetter('length', 'sf')
    for path in paths:
        total_length = sum(operator.mul(*length_sf(G[path[i]][path[i+1]])) 
                           for i in range(len(path)-1)) 
        print('{}: {}'.format(path, total_length))
    

    两个选项都产生(x, y = 'Node1', 'Node3'

    ['Node1', 'Node2', 'Node3']: 1070
    ['Node1', 'Node4', 'Node3']: 2600
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-21
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      相关资源
      最近更新 更多