Python Networkx-如何从“网络”中获取价值;所有“U对”最短路径“U长度”;功能?

Python Networkx-如何从“网络”中获取价值;所有“U对”最短路径“U长度”;功能?,python,networkx,Python,Networkx,首先,我看一下如何在第一个anwser中使用所有的_pairs_dijkstra_path_length函数 当我试图从这些代码中获取距离值时 G = nx.read_gpickle("Database/Pickle/man.gpickle") path_lengths = nx.all_pairs_dijkstra_path_length(G, weight='cost') l = path_lengths.get("Man").get("Year") print(l) for p in p

首先,我看一下如何在第一个anwser中使用所有的_pairs_dijkstra_path_length函数

当我试图从这些代码中获取距离值时

G = nx.read_gpickle("Database/Pickle/man.gpickle")
path_lengths = nx.all_pairs_dijkstra_path_length(G, weight='cost')
l = path_lengths.get("Man").get("Year")
print(l)
for p in path_lengths:
   print(p)

但它是这样的错误

AttributeError: 'generator' object has no attribute 'get'
这就是当我用这些代码打印时,路径长度的样子

G = nx.read_gpickle("Database/Pickle/man.gpickle")
path_lengths = nx.all_pairs_dijkstra_path_length(G, weight='cost')
l = path_lengths.get("Man").get("Year")
print(l)
for p in path_lengths:
   print(p)

输出

('Man', {'Man': 0, 'Woman': 1.1532125205930808, 'Year': 1.9607843137254901, 'Baby': 2.4390243902439024})
('Woman', {'Woman': 0, 'Man': 1.1532125205930808, 'Baby': 1.477832512315271, 'Year': 2.4390243902439024})
('Year', {'Year': 0, 'Man': 1.9607843137254901, 'Woman': 2.4390243902439024, 'Baby': 3.9168569025591733})
('Baby', {'Baby': 0, 'Woman': 1.477832512315271, 'Man': 2.4390243902439024, 'Year': 3.9168569025591733})

这仍然很奇怪。你的帖子仍然不完整,但我想我可以找出两个问题中的一个。请看这个可爱的博客寻求帮助

要更仔细地诊断问题,请执行基本调试:

print (type(path_lengths), path_lengths)
打印循环通过迭代器推送关键变量来掩盖问题。错误消息声称您正在尝试调用生成器的
get
方法。您在该行中有两个
get
调用,但尚未尝试找出问题所在

假设1

虽然
所有的dijkstra\u路径长度都应该返回一个dict,但不知怎的,您有一个生成器。上面的
打印类型将检查该问题。如果是这种情况,您需要转换为所需的用途,例如

path_list = list(path_lengths)
假设2

您确实收到了一份dict,但其中的信息并不是您所认为的。您打印出来的内容表明您有元组作为键。看一行,路径长度中的一个
p

('Man', {'Man': 0,
         'Woman': 1.1532125205930808, 
         'Year': 1.9607843137254901, 
         'Baby': 2.4390243902439024
        }
)
这也没有
get
方法,尽管您的错误可能是

AttributeError: 'tuple' object has no attribute 'get'


不管怎样,我对你的网络设置高度怀疑;输出表明网络中存在异常值。

您可能正在使用networkx v2.x。您编写的代码假定所有的路径对长度都是dict。networkx v1.11(可能更早)就是这种情况

但是现在已经改变了。现在它返回一个迭代器。以下是来自以下网站的信息:

随着NetworkX 2.0的发布,我们将转向视图/迭代器报告API。我们已经改变了许多方法,从报告列表或DICT到迭代信息

对代码最简单的更改是使用

path_lengths = dict(nx.all_pairs_dijkstra_path_length(G, weight='cost'))

您发布的内容不一致,而不是您当前如何定义路径长度:错误消息明确指出所涉及的对象(字典条目)——是一个生成器,但您的输出指示一些包含字符串和dict的非Python元组序列。谢谢您的建议,现在我添加了一些详细信息。谢谢,我现在知道了,但我认为它不适合非常大的图形,对吗?实际上,现在我尝试使用
循环
单源路径最短路径长度
来查找具有给定节点的所有对,但我认为这太长了。我尝试了
dict(nx.all\u pairs\u dijkstra\u path\u length(G,weight='cost')
,但它也太长了。是的,它会花费很长时间。问题是您正在查找所有对之间的最短路径。这很慢,因为有很多对。如果您不需要所有对,那么有一些方法可以只做特定的对。