具有同等优先级的 Heapq

Heapq with equal priority

我正在努力创造一个时髦的事件。因此,我定义了一个 class Event ,它由我的不同事件继承。

class Event:
    def __init__(self, last_instant):
        self.last_instant = last_instant # That's the prio criteria

class Event1(Event):
    def __init__(self, last_instant, value):
        Event.__init__(self, last_instant)
        self.value = value

class Event2(Event):
    ...

last_instant是prio标准,因此堆由定义如下的元组组成:

(last_instant, Event)

但是,我有事件放置在相同的 last_instant,因此 heapqEvent 中查找 < 实现。我还没有实现它,但即使我实现了,我也不知道如何实现,因为有些事件没有任何标准来区分哪些应该首先从堆中弹出。

如果 last_instant 相同,如何实现顺序无关紧要的堆?

另一方面,如果我在同一时刻(相同优先级)有相同类型(相同class)的事件,我想将它们弹出并同时处理它们。

据我所知,实现此目的的最佳方法是同时弹出所有项目,将它们存储在列表中,然后按顺序处理它们。然后进入下一瞬间。但是,它似乎与 heapq 不兼容。

谢谢!

没有理由不使用您提出的方法:同时弹出所有项目,将它们存储在列表中,然后按顺序处理它们。基本思路是:

item = heap.pop()
itemlist.push(item)
while (heap not empty && heap.peek().priority == item.priority) {
    itemlist.push(heap.pop());
}

当然,您会希望将其转换为真正的 Python 代码,但基本思想是有效的,并且是对堆的完全有效使用。