计算networkx中的传出和传入边缘时,带有'dict_keyiterator'的len throws没有len()

时间:2018-12-02 20:32:05

标签: python-3.x networkx

我正在实现一个图形操作脚本,但我对以下错误感到困惑:

Traceback (most recent call last):
  File ".....py", line 12, in <module>
    print(len(graph.predecessors(i)), len(graph.successors(i)))
>>TypeError: object of type 'dict_keyiterator' has no len()<<

这是代码:

import networkx as nx

graph = nx.DiGraph()

for i in range(10):
  graph.add_node(i)

for i in range(9):
  graph.add_edge(i, i+1)

for i in range(10):
  print(len(graph.predecessors(i)), len(graph.successors(i)))

这是dict_keyiterator是什么,以及如何修复我的代码?谢谢!

1 个答案:

答案 0 :(得分:0)

该问题最终可以通过将迭代器转换为列表来解决:

print(len(list(graph.predecessors(i))), len(list(graph.successors(i))))

正如Yakym Pirozhenko所建议的那样,提出了一种替代方法,该方法被认为更快,因此我进行了检查:

def f1():
  for i in range(10):
    len(list(graph.predecessors(i)))

def f2():
  for i in range(10):
    sum(1 for _ in graph.predecessors(i))

print(timeit.timeit(f1, number=100000))
print(timeit.timeit(f2, number=100000))

得到了:

0.529827729
0.652576311

很显然,这里的len(list(...))方法更快。 我正在使用:Windows 10上的Python 3.7。


经过一番搜索,我发现了一个带有similar problem和简单明了的解释here的问题:

  

在2.x版iter(some_dict)中返回一个字典关键字(奇怪   连字号)。在3.x中,它是dict_keyiterator(正常的下划线)。

因此,似乎直接使用iter(d)(其中ddict)会导致Python 3中的对象类型为dict_keyiterator。这是3个迭代器替换之一Python 2:d.viewkeys()d.viewitems()d.viewvalues()

  

在3.x中iter()返回的相应迭代器是   dict_keyiteratordict_itemiteratordict_valueiterator