Python中的优先队列比较器

这篇文章将探讨用Python开发一个自定义的优先级队列。除此之外,我们还将学习如何利用优先级队列的自定义比较器函数。

Python中的优先级队列

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

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

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

Python中的优先级队列自定义比较器

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

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

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

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

  1. 使用 Python 中的列表的优先级队列
  2. 使用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 的队列类管理的信息。HeapDictHeapQueue 类是dict 类的内置子类。

它们承担了dict的所有方法,并提供了与堆交互的方法,它们继承了这些方法。

请注意,heapdict 模块不会自动为我们安装。我们必须使用下面的命令来配置heapdict

pip install heapdict

在完成了heapdict 库的安装后,我们现在准备在实现优先级队列的过程中使用它了。

  1. 第一步是导入heapdict 的库。
  2. 制作一个变量,用来调用heapdict 函数,并继续使用该变量来实现优先级。
  3. 在这一点上,我们将使用之前开发的函数为每个任务分配优先级。
  4. 利用一个while 循环。
  5. 通过打印变量来显示结果。

整个代码可以写成以下形式。

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中创建一个自定义的优先级队列有帮助。