Networkx-如何从“ all_pairs_shortest_path_length”功能获得价值?

时间:2019-09-05 14:44:49

标签: python networkx

首先,我看一下如何在第一个答案中的Networkx - How to get shortest path length between nodes showing node id instead of label中使用all_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)

但是这样的错误

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

当我使用这些代码打印时,path_lenghts的外观是这样的

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})

2 个答案:

答案 0 :(得分:0)

这仍然很奇怪。您的发布仍然不完整,但是我认为我可以确定两个问题之一。请访问这个可爱的debug博客以获取帮助。

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

print (type(path_lengths), path_lengths)

您的打印循环通过将关键变量推入迭代器来掩盖该问题。错误消息表明您正在尝试调用生成器的get方法。您在该行中有两个 get调用,但没有尝试找出是什么问题。

假设1

尽管all_pairs_dijkstra_path_length应该返回一个字典,但是您还是可以使用生成器。上面的print type将检查该问题。在这种情况下,您需要转换为所需的用法,例如

path_list = list(path_lengths)

假设2

没有返回了一个字典,但是其中的信息并不是您认为的那样。打印出的内容表明您有元组作为键。看一行,一行p in path_lengths

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

这也没有get方法,尽管那时您的错误本来是

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

无论哪种方式,我都非常怀疑您的网络设置;输出表明您的网络中存在异常值。

答案 1 :(得分:0)

您可能正在使用networkxv2.x。您编写的代码假定all_pairs_dijkstra_path_length是字典。在networkx v1.11(甚至更早)中就是这种情况。

但是现在已更改。现在,它返回一个迭代器。以下是来自migration guide的信息:

  

随着NetworkX 2.0的发布,我们将转向视图/迭代器报告API。我们已将许多方法从报告列表或字典更改为遍历信息。

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

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

代替您当前定义path_lengths的方式。