【问题标题】:Python: Detect cycle using next and iter in a diminishing setPython:在递减集中使用 next 和 iter 检测循环
【发布时间】:2018-11-10 15:05:53
【问题描述】:

我正在关注 Tushar Roy 的 video 在有向图中检测循环。我了解使用白色、灰色和黑色集来检测循环,但我不明白的主要是当我们检查 white 集的长度时,next(iter(white)) 会知道下一步该去哪里因为设置的大小已经改变。文档说iter 为您提供了一个迭代器对象,next 将检索下一项。迭代器每次评估的重点是不同的吗?

您可以找到代码herehere

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)

【问题讨论】:

  • [dfs] 不是正确的标签:"DFS 是微软的分布式文件系统。注意:关于深度优先搜索的问题,请使用深度优先搜索标签。*不要与 [depth-first-search]"* 混淆
  • @c0der,我做出了改变。谢谢。

标签: python iterator depth-first-search next


【解决方案1】:

next(iter(white)) 只返回集合white 的一个元素。一个集合是没有顺序的,所以不能保证选择哪个元素。您认为迭代器针对循环的每次迭代进行评估是正确的。

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

【讨论】:

  • 如果可以的话,我会添加额外的投票来说明for 循环不起作用的原因。
猜你喜欢
  • 2017-05-25
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多