维护两个相同类型对象的优先级队列,每个对象具有不同的排序属性
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]
所以,我有一个 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]