返回信息流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())
```么?
这是一条镜像帖。来源:北邮人论坛 / python / #25873同步于 1 周前
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
【求助】python如何实现优先级队列的自定义比较器
Dou2
1 周前镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
【 在 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标准库的可怕了吧,请速速叛逃
【 在 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)`这样的元组的。
【 在 AlHg 的大作中提到: 】
:
: [md]
: 如果你一定要用负号的话,可以再包一层:
: ...................
哈哈哈谢谢,去看了文档,也看了些解释,也只能这样了,本来想着可以和list一样用key指定呢,堆还是有点麻烦的[em2]
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
哈哈,我就是在想怎么像Java那样优雅的实现,在堆里面只存student,而不是一个元组那样
【 在 wangzhenGe 的大作中提到: 】
: python优先级队列可以用heapq,相当于特殊排列的list。其中,每个元素可以是一个tuple。tuple是按照元素顺序排序的。示例:
: >>> h = []
: ............