Python:在递减集中使用 next 和 iter 检测循环



我正在关注Tushar Roy关于检测有向图中周期的视频。我理解使用白色、灰色和黑色集合来检测周期,但我不明白的主要事情是,当我们检查white集的长度时,next(iter(white))会知道下一步该去哪里,因为集合大小已经改变。文档说iter给你一个迭代器对象,next会检索下一项。迭代器的每次评估是否不同?

您可以在此处或此处找到代码。

def has_cycle(graph):
white = set()
gray = set()
black = set()
for vertex in graph.all_vertex.values():
white.add(vertex)
while len(white) > 0:
current = next(iter(white))       
if dfs(current, white, gray, black) == True:
return True
return False        
def dfs(current, white, gray, black):
move_vertex(current, white, gray)
for neighbor in current.adjacent_vertices:
if neighbor in black:
continue
if neighbor in gray:
return True
if dfs(neighbor, white, gray, black) == True:
return True
move_vertex(current, gray, black)
return False
def move_vertex(vertex, source_set, destination_set):
source_set.remove(vertex)
destination_set.add(vertex)

next(iter(white))只返回集合white的一个元素。集合不是排序的,因此无法保证选取哪个元素。您认为迭代器是针对循环的每次迭代进行评估的,这是正确的。

集合随着循环的进行而变化的事实禁止使用for循环。

最新更新