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

Raj*_*rif 9 python priority-queue

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

mac*_*one 14

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

import heapq

queue = []
my_list = [...]
for element in my_list:
    heapq.heappush(queue, (my_func(element), element))
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您有元素的包装类,那么您可以使用运算符重载

例如,假设您有一个CustomNumber类(相当于您的元素),其中顺序由模 16 值(私有函数)确定__f(),您可以重写比较运算符,例如:

class CustomNumber:
    def __init__(self, value):
        self.value = value

    def __f(self, x):
        return x % 16

    def __lt__(self, obj):
        """self < obj."""
        return self.__f(self.value) < self.__f(obj.value)

    def __le__(self, obj):
        """self <= obj."""
        return self.__f(self.value) <= self.__f(obj.value)

    def __eq__(self, obj):
        """self == obj."""
        return self.__f(self.value) == self.__f(obj.value)

    def __ne__(self, obj):
        """self != obj."""
        return self.__f(self.value) != self.__f(obj.value)

    def __gt__(self, obj):
        """self > obj."""
        return self.__f(self.value) > self.__f(obj.value)

    def __ge__(self, obj):
        """self >= obj."""
        return self.__f(self.value) >= self.__f(obj.value)
Run Code Online (Sandbox Code Playgroud)

使得下面的代码:

a = CustomNumber(16)
b = CustomNumber(14)

print('a < b =', a < b)
print('a <= b =', a <= b)
print('a == b =', a == b)
print('a != b =', a != b)
print('a > b =', a > b)
print('a >= b =', a >= b)
Run Code Online (Sandbox Code Playgroud)

印刷:

a < b = True
a <= b = True
a == b = False
a != b = True
a > b = False
a >= b = False
Run Code Online (Sandbox Code Playgroud)