Python 中的队优先级列比较器


本文将研究使用 Python 开发自定义优先级队列。 除此之外,我们还将学习如何将自定义比较器函数与优先级队列一起使用。


Python 中的优先级队列

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

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

我们可以使用优先队列来做到这一点。


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

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

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

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

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

  1. 优先队列在 Python 中使用列表
  2. 优先队列使用Python的heapdict模块

在 Python 中使用列表的优先级队列

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

我们将从 1 开始,逐步提升。 因此,每个名字都会被分配一个编号,作为名单上的优先顺序。

优先级是一个整数,用于确定任务最终完成时的执行顺序。

让我们使用代码来完成它。 首先,我们将创建一个名为 names 的列表。

此列表最初为空。 请参阅下面的代码。

names = []

现在,要将名称添加到列表中,我们将使用可以从列表功能轻松访问的 append 方法。 append 方法需要传入两个参数。

向列表中添加一个数字以指示优先级、数字、名称或其他任何内容。 出于我们的目的,我们希望名字 Abid 出现在列表中的位置 1。

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 循环时,名称列表记录将被打印出来。

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 类的内置子类。

它们采用了字典的所有方法,并提供了与它们继承的堆进行交互的方法。

%> 请注意 ,不会自动为我们安装 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 中创建自定义优先级队列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迹忆客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值