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)