Python heapq 优先级队列最大堆
Python heapq Priority Queue Maxheap
我知道使用 heapq 的优先级队列是作为 minheap 实现的。我需要将优先级队列实现为 maxheap,它按 AWS 日期时间字符串对元素进行排序。当我调用 heapq.heappop() 方法时,我希望具有最新日期时间的元素首先从队列中弹出。网上的一切似乎都指向仅使用 minheap,但在输入期间使您的值变为负值,以便将更大的值推到顶部而不是底部。但是,我似乎找不到任何方法将其实际应用于日期时间字符串,例如“2021-06-03T16:11:14.206650Z”。有没有一种方法可以使该字符串 'negative' 或以某种方式使它能够首先从堆中弹出最近的日期?
有几种方法可以解决这个问题。
一个是将date/time转换为序数,然后取反
-dateutil.parser.parse('2021-06-03T16:11:14.206650Z').toordinal()
如果要保留原始日期字符串,则将此数字与日期字符串放在一个元组中。
将您的时间戳转换为最大时间戳的偏移量。然后最近的时间戳将具有最小的键,使最小堆合适。
注意dateutil
是第三方模块。
>>> import datetime, dateutil
>>> now = datetime.datetime.now().timestamp()
>>> june3 = dateutil.parser.isoparse('2021-06-03T16:11:14.206650Z').timestamp()
>>> june1 = dateutil.parser.isoparse('2021-06-01T00:00:00Z').timestamp()
>>> now - june3 < now - june1
True
我知道使用 heapq 的优先级队列是作为 minheap 实现的。我需要将优先级队列实现为 maxheap,它按 AWS 日期时间字符串对元素进行排序。当我调用 heapq.heappop() 方法时,我希望具有最新日期时间的元素首先从队列中弹出。网上的一切似乎都指向仅使用 minheap,但在输入期间使您的值变为负值,以便将更大的值推到顶部而不是底部。但是,我似乎找不到任何方法将其实际应用于日期时间字符串,例如“2021-06-03T16:11:14.206650Z”。有没有一种方法可以使该字符串 'negative' 或以某种方式使它能够首先从堆中弹出最近的日期?
有几种方法可以解决这个问题。
一个是将date/time转换为序数,然后取反
-dateutil.parser.parse('2021-06-03T16:11:14.206650Z').toordinal()
如果要保留原始日期字符串,则将此数字与日期字符串放在一个元组中。
将您的时间戳转换为最大时间戳的偏移量。然后最近的时间戳将具有最小的键,使最小堆合适。
注意dateutil
是第三方模块。
>>> import datetime, dateutil
>>> now = datetime.datetime.now().timestamp()
>>> june3 = dateutil.parser.isoparse('2021-06-03T16:11:14.206650Z').timestamp()
>>> june1 = dateutil.parser.isoparse('2021-06-01T00:00:00Z').timestamp()
>>> now - june3 < now - june1
True