维护两个相同类型对象的优先级队列,每个对象具有不同的排序属性

Maintain two priority queues of objects of the same type, with different sort attributes for each

所以,我有一个 class P。我想要两个 P 类型对象的优先级队列,以及一个 P 类型对象的优先级队列。但是,我想在 P.x 上订购其中一个,并在 P.y 上订购另一个。现在,queue.PriorityQueue.put() 不支持按键功能,所以我采用了以下方法:

class P:
    ...
    def __lt__(self, other):
        return self.y < other.y
    ...

然而,这不允许基于P.x的排序,同时,我想偷看一个队列而不是另一个队列,queue.PriorityQueue没有peek 函数。因此,我用排序列表替换了其中一个优先级队列。我不能使用 SortedContainers 库,因为这是作业,我不能保证评分服务器安装了它,所以我转而使用 bisect.insort.

然而,唯一的问题是 bisect.insort 也不支持按键功能。因此,我不得不自己编写函数binary_insert(lst, item, key)来完成这个任务,然后用binary_insert(lst, item, key = lambda i: i.x)调用它。这感觉就像一个 hack,因为我正在编写自己的二进制插入函数,而二进制插入是一个核心计算机科学概念,以前一定有人提出过。

一种方法是让列表存储 (x, p) 形式的元组,并让优先级队列存储 (y, p) 形式的元组。但是,有没有其他方法可以将这些属性内化到 P 本身?否则,每次弹出一个项目时,我都必须解包一个元组,这可能会导致我的程序中充斥着未使用的变量。

也许你可以继承 PriorityQueue 来为你做元组,像这样(完全未经测试的代码):

class MyPriorityQueue(PriorityQueue):
    def _put(self, item):
        super()._put((item.x, item))

    def _get(self):
        return super()._get()[1]