BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #25873同步于 1 周前
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

【求助】python如何实现优先级队列的自定义比较器

Dou2
1 周前镜像同步7 回复
rt 举个例子:(不恰当但需要用优先级队列) 一个优先级队列,要实现对学生学号从大到小的排序 是只能在put里一个一个写```qp.put(-student.sno,student)```来实现, 或者在类里面写__lt__的函数, ```python class student: def __init__(self, sno, sname): self.sno = sno self.sname = sname def __lt__(self, student1, student2): pass def cmp(student1, student2): return student2.sno - student1.sno import queue qp = queuq.Priorityqueue() qp.put() ``` 不能实现java那种自定义比较器的方法写吗``` new PriorityQueue<>(new Comparator()) ```么?
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
yo1995机器人#1 · 2021/11/3
好像是不行的,坐等楼下补充
Dou2机器人#2 · 2021/11/3
搜了搜,应该是只能写student类里面的__lt__函数去实现大小比较了,这样可能比较方便一点
AlHg机器人#3 · 2021/11/3
【 在 Dou2 的大作中提到: 】 : rt : [md] : 举个例子:(不恰当但需要用优先级队列) : ................... 文档没提那就是没有,毕竟如果辛辛苦苦实现了为什么不写: [Python: queue.PriorityQueue](https://docs.python.org/3/library/queue.html#queue.PriorityQueue) Python鼓励在用优先队列时,使用`dataclasses`中的`dataclass`装饰器定义容器内元素,配合同样在`dataclasses`中的`field`来标记那些字段需要被比较。 照抄原文: ``` python from dataclasses import dataclass, field from typing import Any @dataclass(order=True) class PrioritizedItem: priority: int item: Any=field(compare=False) ``` 这套模式适用于所有只用来表示数据的类,不限于用在这里,因为照着规矩写不用自己实现比较函数,还更加符合Python可读性的哲学(虽然做的不好) 具体到你需要的情况,可以在开头加一个用于比较的字段`sort_id: int=field(init=False)`,然后再手动写一个`__post_init__`魔法方法使其等于你需要比较的优先级字段取负数。 实在不行你也可以自己用`heapq`来实现允许定义lambda比较器的优先队列。 (感受到Python标准库的可怕了吧,请速速叛逃
AlHg机器人#4 · 2021/11/3
【 在 Dou2 的大作中提到: 】 : rt : [md] : 举个例子:(不恰当但需要用优先级队列) : ................... 如果你一定要用负号的话,可以再包一层: ``` python class ReversePriorityQueue(PriorityQueue): def put(self, tup): newtup = tup[0] * -1, tup[1] PriorityQueue.put(self, newtup) def get(self): tup = PriorityQueue.get(self) newtup = tup[0] * -1, tup[1] return newtup ``` 随便找的例子,他这个是用于`(priority_number, data)`这样的元组的。
Dou2机器人#5 · 2021/11/3
【 在 AlHg 的大作中提到: 】 : : [md] : 如果你一定要用负号的话,可以再包一层: : ................... 哈哈哈谢谢,去看了文档,也看了些解释,也只能这样了,本来想着可以和list一样用key指定呢,堆还是有点麻烦的[em2]
wangzhenGe机器人#6 · 2021/11/3
python优先级队列可以用heapq,相当于特殊排列的list。其中,每个元素可以是一个tuple。tuple是按照元素顺序排序的。示例: >>> h = [] >>> heappush(h, (5, 'write code')) >>> heappush(h, (7, 'release product')) >>> heappush(h, (1, 'write spec')) >>> heappush(h, (3, 'create tests')) >>> heappop(h) (1, 'write spec') 参考: https://docs.python.org/3/library/heapq.html
Dou2机器人#7 · 2021/11/3
哈哈,我就是在想怎么像Java那样优雅的实现,在堆里面只存student,而不是一个元组那样 【 在 wangzhenGe 的大作中提到: 】 : python优先级队列可以用heapq,相当于特殊排列的list。其中,每个元素可以是一个tuple。tuple是按照元素顺序排序的。示例: : >>> h = [] : ............