Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python len用';dict#u键迭代器';在networkx中计算传出和传入边时没有len()_Python_Python 3.x_Networkx - Fatal编程技术网

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