Python len用';dict#u键迭代器';在networkx中计算传出和传入边时没有len()
我正在实现一个图形操作脚本,我对以下错误感到困惑:Python len用';dict#u键迭代器';在networkx中计算传出和传入边时没有len(),python,python-3.x,networkx,Python,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()<< 这是什么d
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()<<
这是什么
dict_keyinterator
以及如何修复我的代码?谢谢 通过将迭代器转换为列表,问题最终得以解决:
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
经过一番搜索,我发现了一个简单明了的问题: 在2.x
iter(一些dict)
中,返回一个字典键迭代器(dictionary keyterator)
连字符)。在3.x中,它是一个dict\u键迭代器(正常下划线)
因此,直接使用iter(d)
,其中d
是dict
,似乎会导致Python 3中类型为dict\u key迭代器的对象。这是取代Python 2的3个迭代器之一:d.viewkeys()
、d.viewitems()
、和d.viewvalues()
:
3.x中的iter()
返回的相应迭代器是
dict\u键迭代器
,dict\u项迭代器
,和dict\u值迭代器
您可以使用sum(1表示图中的uu.preduences(i))
而不是len
+列表来避免创建新副本。
0.529827729
0.652576311