用于在Python中构建PriorityQueue的自定义比较器

用于在Python中构建PriorityQueue的自定义比较器,python,priority-queue,Python,Priority Queue,我试图在Python中使用PriorityQueue构建优先级队列,但我希望它在将元素传递给函数后使用函数的返回值,类似于sorted(mtlist,key=myfun),而不是将元素用于优先级比较,是否有办法实现这一点,不要将元素直接插入队列,而是将每个元素包装在一个元组中,元组中的第一个元素是所需的排序键。元组按元素的顺序进行排序(即,首先比较第一个元素),因此为什么排序键需要排在第一位 import heapq queue = [] my_list = [...] for element

我试图在Python中使用PriorityQueue构建优先级队列,但我希望它在将元素传递给函数后使用函数的返回值,类似于sorted(mtlist,key=myfun),而不是将元素用于优先级比较,是否有办法实现这一点,

不要将元素直接插入队列,而是将每个元素包装在一个元组中,元组中的第一个元素是所需的排序键。元组按元素的顺序进行排序(即,首先比较第一个元素),因此为什么排序键需要排在第一位

import heapq

queue = []
my_list = [...]
for element in my_list:
    heapq.heappush(queue, (my_func(element), element))

如果有元素的包装器类,那么可以使用

例如,假设您有一个CustomNumber类(相当于您的元素),其中顺序由模16值决定(私有函数
\uu f()
),您可以覆盖比较运算符,如:

class自定义编号:
定义初始值(自身,值):
自我价值=价值
定义f(自,x):
返回x%16
定义(自我、目标):
“selfself.\u f(obj.value)
定义(自我,obj):
“”“self>=obj。”“”
返回self.\u f(self.value)>=self.\u f(obj.value)
使以下代码:

a=CustomNumber(16)
b=客户编号(14)
打印('a=b=',a>=b)
印刷品:

a < b = True
a <= b = True
a == b = False
a != b = True
a > b = False
a >= b = False
a=b=False

你写问题的方式是无法实现的。根据报告:

首先检索值最低的条目(值最低的条目是排序后的
返回的条目(列表(条目))[0]
)。条目的典型模式是元组,格式为:
(优先级号,数据)

换句话说,优先级是通过在条目上运行
sorted
来定义的,并且无法为该
sorted
运行定义
参数

因此,在定义PriorityQueue时不能设置排序函数。您必须使用提供的其他解决方案之一(或者编写自己的PriorityQueue实现,这应该不会太难)

编辑 检查后,我发现文档并不是对其工作原理的精确描述,而是一种简化


但是,它也显示了您自己实现是多么容易。

与此问题相关的这种方法的唯一问题是,插入/弹出每个元素时,
\uuuf
将被多次调用,如果
\uuf
是一个昂贵的计算,这不是最优的。是的,不是,您可以“缓存”相反,这是一种价值观。检查Pydenny对缓存属性的实现:谢谢@mackorone,我最后这样做了:-)如果两个项目之间的
my_func(element)
相同,这可能会导致错误。。。如果发生这种情况,比较将返回到
元素
——该元素甚至可能不具有可比性,并且会给您带来一个恼人的、非常罕见的错误。您想要一个“客户”比较器吗?还是“自定义”比较器?这是自定义的,抱歉输入错误