有没有办法使优先级队列仅按元组中的优先级值排序,而忽略成对中的另一个值?

Is there a way to make a priority queue sort by the priority value in a tuple only, ignoring the other value in a pair?

我正在使用 Python 的 Queue.PriorityQueue(在 A* 算法的实现中,但我不确定这是否相关)。我用它来保存不可比较的对象(我无法修改的教授提供的对象 class),并且 Python 在尝试添加优先对象元组时抛出错误(例如 pq.put(1, object))当它已经持有具有相同优先级的元组时。

这是错误的相关部分:

File "pathfinding.py", line 192, in astar
  frontier.put((priority, neighbor))
File "/usr/lib/python3.7/queue.py", line 149, in put
  self._put(item)
File "/usr/lib/python3.7/queue.py", line 233, in _put
  heappush(self.queue, item)
TypeError: '<' not supported between instances of 'InfNode' and 'InfNode'

基本上,我正在寻找一种绕过试图比较这两个对象的 PriorityQueue 的方法。相同优先级的对象排序的确切顺序对我来说完全不重要。

我确实找到了 ,但它没有使用 PriorityQueue,所以我不确定我是否可以做类似的事情,或者这是否完全不可能(在这种情况下我'我将不得不修改我的算法以使其成为这样,这是不可取的。)。

好吧,以防万一有人在这里结束,我最终考虑了超级雨的评论,因为我正在寻找一个更简单的解决方案,而且我真的没有时间彻底修改我的解决方案以使其更有效率或更好。我只是需要一些东西来工作。

解决方案基本上就是实施建议 here。如果有人正在看这个但真的不明白 Python 是如何工作的(比如我!),请将其放在顶部。

from dataclasses import dataclass, field
from typing import Any

@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)

然后不对元组使用 .put(),而是将整个 PrioritizedItem class 放在 pq.put(PrioritizedItem(0, start))pq.put(PrioritizedItem(priority, data)) 中。然后取出物品:current = pq.get().item.

我想感谢 user2357112-supports-Monica 关于使用自定义堆实现的建议。如果我有时间或对如何使用有任何真正的了解 Python,我很想尝试一下,但我真的没有时间获得超过最低限度功能的解决方案。

我只是出于礼貌才将其张贴在这里。此解决方案可能仅适用于 Python 3.7.