首先,我看一下如何在第一个答案中的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})
答案 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
的方式。