Python中的优先队列比较器
这篇文章将探讨用Python开发一个自定义的优先级队列。除此之外,我们还将学习如何利用优先级队列的自定义比较器函数。
Python中的优先级队列
一个优先级队列是一个数据结构,它允许我们存储具有一定优先级的项目。然后,优先级队列将对这些项目进行排序,使具有最高优先级的项目位于队列的顶部。
优先级队列经常被用于我们需要按优先级顺序处理项目的算法中。假设我们正在处理一个任务列表;我们想先处理最重要的任务。
我们可以用一个优先级队列来实现它。
Python中的优先级队列自定义比较器
Python 中的内置模块queue
提供了一个优先级队列的实现。然而,该模块不允许我们为优先级队列指定一个自定义比较器。
如果我们想对优先级队列使用不同于默认的排序,这可能是一个问题。
幸运的是,有一种方法可以为 Python 优先级队列创建一个自定义比较器。在这篇文章中,我们将看到如何做到这一点。
我们将探讨优先级队列的两个例子。
- 使用 Python 中的列表的优先级队列
- 使用Python的
heapdict
模块的优先级队列
在Python中使用列表的优先级队列
首先,我们将制作一个空白列表。之后,我们将按照重要性的顺序把每个人的名字添加到列表中。
我们将从1开始,依次递增。因此,每个名字将被分配一个数字,作为列表中的优先级。
优先级是一个整数,确定了任务最终完成时的执行顺序。
让我们通过代码来完成它。首先,我们将创建一个名为names
的列表。
这个列表最初将是空的。见下面的代码。
names = []
现在,为了向列表中添加名字,我们将使用append
方法,该方法很容易从list
功能中获得。append
方法需要送入两个参数。
在列表中添加一个数字,表示优先级、数字、名字或其他东西。就我们的目的而言,我们希望Abid
这个名字出现在列表中的position1
。
names.append((1, "Abid"))
可以添加的名字或项目的数量没有限制,索引号将表明它们的优先次序。
示例代码:
names.append((1, "Abid"))
names.append((4, "Jesica"))
names.sort(reverse = True)
names.append((3, "Anna"))
names.sort(reverse = True)
names.append((2, "Pat"))
当我们在这里利用while
循环时,names
列表记录将被打印出来。
while names:
print(names.pop())
这与之前创建的代码相同,复制它并执行它以查看结果。
names = []
names.append((1, "Abid"))
names.append((4, "Jesica"))
names.sort(reverse = True)
names.append((3, "Anna"))
names.sort(reverse = True)
names.append((2, "Pat"))
names.sort(reverse = True)
while names:
print(names.pop())
输出:
(1, 'Abid')
(2, 'Pat')
(3, 'Anna')
(4, 'Jesica')
这是运行该代码的输出。我们可以清楚地看到,每个名字都是根据我们提供的优先级和索引排序的。
Python中使用heapdict
模块的优先级队列
基于堆的优先级队列是通过heapdict
Python模块来实现的。它与普通的heapq
模块相当,但提供了更多的功能和适应性。
二进制堆是heapdict
数据结构的基础。二进制堆是一种数据结构,可以用来存储数据,其方式有利于有效地检索和改变这些数据。
二进制堆是一个完整的二进制树,这表明树上的每个节点都有两个子代,而且树本身总是平衡的。
HeapDict
和 是由 模块提供的两个主要类。 类的功能类似于字典,并将其内容保存在一个堆中。HeapQueue
heapdict
heapdict
堆被用来保存被称为HeapQueue
的队列类管理的信息。HeapDict
和HeapQueue
类是dict
类的内置子类。
它们承担了dict
的所有方法,并提供了与堆交互的方法,它们继承了这些方法。
请注意,heapdict
模块不会自动为我们安装。我们必须使用下面的命令来配置heapdict
。
pip install heapdict
在完成了heapdict
库的安装后,我们现在准备在实现优先级队列的过程中使用它了。
- 第一步是导入
heapdict
的库。 - 制作一个变量,用来调用
heapdict
函数,并继续使用该变量来实现优先级。 - 在这一点上,我们将使用之前开发的函数为每个任务分配优先级。
- 利用一个
while
循环。 - 通过打印变量来显示结果。
整个代码可以写成以下形式。
import heapdict
tasks = heapdict.heapdict()
tasks['Breakfast'] = 3
tasks['Wake up'] = 1
tasks['Get ready for work'] = 4
tasks['Exercise'] = 2
while tasks:
print(tasks.popitem())
输出:
('Wake up', 1)
('Exercise', 2)
('Breakfast', 3)
('Get ready for work', 4)
代码的输出表明,根据代码中分配给各个任务的优先级顺序,代码的运行是正确的。我们活动的输出也遵循同样的顺序,并表明了适当的优先级。
这篇文章告诉我们如何利用列表来建立一个优先级队列。除此之外,我们还经历了在 Python 中创建一个自定义优先级队列的必要步骤。
我们现在知道了如何用优先级队列实现一个自定义的比较器函数。
我们希望这篇文章对你了解如何在Python中创建一个自定义的优先级队列有帮助。