在Python中迭代包含对象的队列

3

我是 Python 的初学者,当我尝试迭代队列时,发现了一个奇怪的错误。

以下是代码片段:

frontier = q.PriorityQueue()

    for goal in goals:
        portals = findPortals(maze)
        comb_value = heuristic(startX, startY, goal[0], goal[1])
        frontier.put_nowait((comb_value, heuristic(startX, startY, goal[0], goal[1]), 0, startX, startY, startX, startY))

        for portal in portals:
            heur = portalHeuristic(maze, startX, startY, goal[0], goal[1])
            frontier.put_nowait((heur, heur, 0, startX, startY, startX, startY))

    for elem in list(frontier):
        print(elem)

尝试打印元素时,显示“TypeError:'PriorityQueue'对象不可迭代”。我能做些什么来解决这个问题吗?我已经在这里尝试找到一些解决方案,但我并没有真正理解任何东西...

听起来你似乎不完全理解优先队列的作用。它通常是一个堆,而不是链表,这意味着除了顶部元素之外,它是无序的。 - Mad Physicist
你是否正在使用这个PriorityQueue - PM 2Ring
另请参见https://dev59.com/VmEi5IYBdhLWcg3wjs9j - PM 2Ring
2个回答

5
PriorityQueue不支持使for循环语法在该数据结构上工作的内部函数(如__iter__next)。
相反,您可以使用一个while循环来检查队列是否为空,使用empty函数,并且如果不为空,根据需要调用getget_nowait来从队列中删除并返回准备好的项。
因为它需要调用者具有消耗队列中下一项的含义的特殊知识,所以支持for循环迭代会很不方便。对于队列,for循环会做什么?总是假设应立即使用get_nowait来消耗当前项后吗?然后,如果队列没有任何立即准备好返回的项目,它可能会抛出异常。它应该始终使用get并永久阻塞等待每个项吗?然后,for循环语法将掩盖可能的复杂性,永久等待。
与选择这些选项中的一个作为默认循环行为不同,这可能会导致许多队列用例的意外行为,标准库实现将负担放在调用方身上,比如像我提到的while循环,明确描述如何“获取”队列中的每个项目。
(注:我假设这个PriorityQueue库/实现与标准库queue模块中的相同)。

非常感谢您对我的问题进行解释和提供解决方案! :) - cybel

1

你可以

for elem in frontier.queue:
        print(elem)

当然,这会破坏信息隐藏。我检查了实现代码并发现,但也许属性被命名为self.queue而不是self._queue,可能有类似的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接