我道歉,我不太了解python,但是我试图将它与这个networkx库一起用来找到" BOS"之间的距离。波士顿机场到我在文本文件中的所有其他机场。我有:
import networkx as nx
G = nx.Graph()
code = []
name = []
longitude = []
latitude = []
rows = 0
with open("airport_info.txt") as f:
content = f.readlines()
rows = len(content)
for i in range(0, rows-1):
columns = content[i].split(",")
G.add_node(columns[0],pos=(float(columns[2]),float(columns[3].replace("\n",""))))
with open("flying_times.txt") as x:
content = x.readlines()
rows = len(content)
for i in range(0,rows-1):
columns = content[i].split(",")
G.add_edge(columns[0],columns[1],weight=float(columns[2].replace("\n","")))
#print list(G.nodes())
#print list(G.edges())
#print nx.shortest_path_length(G,weight='weight')
print nx.shortest_path_length(G,"BOS")
这将为我提供BOS和其他所有机场之间的节点数量,但是如何将其转换为BOS与每个机场之间的实际距离(以小时为单位)?谢谢!
答案 0 :(得分:0)
您应该使用nx.dijkstra_path_length
。特别是如果你想打印全部
节点距离这就是你需要的。
for target in G.nodes_iter():
if target != 'BOS':
print("Distance 'BOS' to '%s': %f" %
(target, nx.dijkstra_path_length(G, "BOS", target)))
如果您想要路径,可以使用nx.dijkstra_path
。
我认为你可能也会遇到一些问题,因为range
没有返回传递给stop
的值,所以你可能会读到比预期更少的一行;你应该使用range(row)
(可以省略0
)。无论如何,代码不是非常pythonic,如果您愿意,您可以使用以下代码:
import networkx as nx
G = nx.Graph()
with open("airport_info.txt") as f:
for line in f:
code, lat, long = line.rstrip().split(",")
G.add_node(code,pos=(float(lat),float(long)))
with open("flying_times.txt") as x:
for line in x:
source, target, distance = line.rstrip().split(",")
G.add_edge(source, target, weight=float(distance))
for target in G.nodes_iter():
if target != 'BOS':
print("Distance 'BOS' to '%s': %f" %
(target, nx.dijkstra_path_length(G, "BOS", target)))
最终考虑:您使用的是无向图。这意味着距离总是对称的,我不知道这是否是你真正需要的。