如何获取字典迭代器的长度?networkx邻居迭代器使用报错如何解决
问题原因
- 首个
TypeError: object of type 'dict_keyiterator' has no len()报错:
NetworkX 2.x的Graph.neighbors()方法返回的是迭代器对象,迭代器为惰性计算设计,本身没有长度属性,无法直接调用len()计算长度。 - 后续
TypeError: 'NoneType' object is not subscriptable报错:
迭代器是一次性消耗品,你第一次调用list(neighbours)时已经把迭代器内的所有元素全部读取耗尽,后续遍历空迭代器时无法拿到有效的邻居节点,你的业务逻辑如果尝试对空值做下标访问就会触发该报错。
解决方案
拿到迭代器后直接转为列表存储,后续所有长度计算、遍历操作都复用这个列表即可,示例代码如下:
# 第一步直接将迭代器转为列表存储 neighbours = list(nxobject.neighbors('Something')) # 直接对列表求长度,无额外消耗 print(len(neighbours)) # 遍历存储好的列表,可正常拿到所有邻居节点 for child in neighbours: # 你的业务逻辑代码 return Done_work return None
特殊场景适配
如果你处理的图节点量级极大,不想一次性把所有邻居节点加载到内存,可以选择在遍历迭代器的同时自行计数,不需要提前转列表:
neighbours = nxobject.neighbors('Something') count = 0 for child in neighbours: count += 1 # 你的业务逻辑代码 print(count)
内容的提问来源于stack exchange,提问作者Saiham Rahman
相关产品推荐
相关产品推荐

