我需要一些关于图表的帮助。我使用 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 个属性:length 和 sf(稍后我会需要它)。我运行这个程序并通过 Node1 和 Node3 得到:
[['Node1', 'Node2', 'Node3'], ['Node1', 'Node4', 'Node3']]
如何计算路径的长度?然后我需要将长度乘以属性“sf”。我把问题简化了,因为以后我有几百个节点,所以会更困难。
我开始考虑 for 函数,但我只是遇到错误。
你可以使用
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
表情:
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
您可以使用 path_weight 函数来计算列表“路径”的各个路径长度:
令
length_of_All_Paths
为list
内每个列表长度的paths
:
length_of_All_Paths = [nx.path_weight(G, temp_path, weight='length') for temp_path in paths]