有没有办法使优先级队列仅按元组中的优先级值排序,而忽略成对中的另一个值?
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.
我正在使用 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 的方法。相同优先级的对象排序的确切顺序对我来说完全不重要。
我确实找到了
好吧,以防万一有人在这里结束,我最终考虑了超级雨的评论,因为我正在寻找一个更简单的解决方案,而且我真的没有时间彻底修改我的解决方案以使其更有效率或更好。我只是需要一些东西来工作。
解决方案基本上就是实施建议 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.