用于在Python中构建PriorityQueue的自定义比较器
我试图在Python中使用PriorityQueue构建优先级队列,但我希望它在将元素传递给函数后使用函数的返回值,类似于sorted(mtlist,key=myfun),而不是将元素用于优先级比较,是否有办法实现这一点,不要将元素直接插入队列,而是将每个元素包装在一个元组中,元组中的第一个元素是所需的排序键。元组按元素的顺序进行排序(即,首先比较第一个元素),因此为什么排序键需要排在第一位用于在Python中构建PriorityQueue的自定义比较器,python,priority-queue,Python,Priority Queue,我试图在Python中使用PriorityQueue构建优先级队列,但我希望它在将元素传递给函数后使用函数的返回值,类似于sorted(mtlist,key=myfun),而不是将元素用于优先级比较,是否有办法实现这一点,不要将元素直接插入队列,而是将每个元素包装在一个元组中,元组中的第一个元素是所需的排序键。元组按元素的顺序进行排序(即,首先比较第一个元素),因此为什么排序键需要排在第一位 import heapq queue = [] my_list = [...] for element
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)
打印('ab)
打印('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)
相同,这可能会导致错误。。。如果发生这种情况,比较将返回到元素
——该元素甚至可能不具有可比性,并且会给您带来一个恼人的、非常罕见的错误。您想要一个“客户”比较器吗?还是“自定义”比较器?这是自定义的,抱歉输入错误