Python教程:优先队列比较器

用Python开发一个自定义的优先级队列。

Python中的优先级队列

一个优先级队列是一个数据结构,它允许我们存储具有一定优先级的项目。然后,优先级队列将对这些项目进行排序,使具有最高优先级的项目位于队列的顶部。

优先级队列经常被用于我们需要按优先级顺序处理项目的算法中。假设我们正在处理一个任务列表;我们想先处理最重要的任务。

我们可以用一个优先级队列来实现它。

优先级队列自定义比较器

Python 中的内置模块queue 提供了一个优先级队列的实现。然而,该模块不允许我们为优先级队列指定一个自定义比较器。

如果我们想对优先级队列使用不同于默认的排序,这可能是一个问题。

幸运的是,有一种方法可以为 Python 优先级队列创建一个自定义比较器。在这篇文章中,我们将看到如何做到这一点。

我们将探讨优先级队列的两个例子。

  • 使用 Python 中的列表的优先级队列
  • 使用Python的heapdict 模块的优先级队列

使用列表的优先级队列

首先,我们将制作一个空白列表。之后,我们将按照重要性的顺序把每个人的名字添加到列表中。

我们将从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')

这是运行该代码的输出。我们可以清楚地看到,每个名字都是根据我们提供的优先级和索引排序的。

使用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())
#Python小白学习交流群:153708845

输出:

('Wake up', 1)
('Exercise', 2)
('Breakfast', 3)
('Get ready for work', 4)

代码的输出表明,根据代码中分配给各个任务的优先级顺序,代码的运行是正确的。我们活动的输出也遵循同样的顺序,并表明了适当的优先级。

这篇文章告诉我们如何利用列表来建立一个优先级队列。除此之外,我们还经历了在 Python 中创建一个自定义优先级队列的必要步骤。

我们现在知道了如何用优先级队列实现一个自定义的比较器函数。

我们希望这篇文章对你了解如何在Python中创建一个自定义的优先级队列有帮助。

猜你喜欢

转载自blog.csdn.net/qdPython/article/details/132149106