当计算networkx中的传出和传入边时,使用“dict_keyiterator”的len抛出没有len()

2024-04-19 00:46:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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以及如何修复我的代码?谢谢


Tags: 代码in脚本addforlen错误range
1条回答
网友
1楼 · 发布于 2024-04-19 00:46:00

通过将迭代器转换为列表,问题最终得以解决:

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(...))方法更快。 我在Windows10上使用的是:Python3.7


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

In 2.x iter(some_dict) returns a dictionary-keyiterator (weird hyphen). In 3.x it's a dict_keyiterator (normal underscore).

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

The corresponding iterators returned by iter() in 3.x are dict_keyiterator, dict_itemiterator, and dict_valueiterator.

相关问题 更多 >