深入解析Python 中的 sortedcontainers 库:高效的排序数据结构

news2024/9/26 3:28:34

在这里插入图片描述

在日常的 Python 编程中,列表(list)、集合(set)和字典(dict)是常用的数据结构。然而,在某些特定的场景下,我们需要对数据进行排序,并且希望在插入、删除或访问元素时能够保持有序。在标准库中,虽然我们可以通过 list.sort() 或者 sorted() 函数对列表进行排序,但这些操作每次都需要 O(n log n) 的复杂度,这对一些高频操作来说效率并不理想。

sortedcontainers 是一个高效的 Python 库,它为开发者提供了三种主要的容器数据结构,分别是 SortedListSortedDictSortedSet,能够在 O(log n) 的时间复杂度下完成插入、删除和访问操作,并且自动保持元素的有序性。在本文中,我们将详细介绍 sortedcontainers 库的核心功能,展示如何利用它的高效数据结构解决一些常见的编程问题。

在这里插入图片描述
华丽的分割线

⭕️宇宙起点

    • ❓ 为什么选择 `sortedcontainers`?
      • 安装
    • 🔴 SortedList - 有序列表
      • 基本操作
      • SortedList 的主要特性
      • 应用场景:排行榜
    • 🔴 SortedDict - 有序字典
      • 基本操作
      • SortedDict 的主要特性
      • 应用场景:事件调度
    • 🔴 SortedSet - 有序集合
      • 基本操作
      • SortedSet 的主要特性
      • 应用场景:独特元素的排序管理
    • 🥇 性能与应用
    • 📥 下载地址
    • 💬 结语
    • 📒 参考文献


标题1

❓ 为什么选择 sortedcontainers

sortedcontainers 是一个轻量级且高效的库,提供了自动排序的数据结构,能够替代 Python 标准库中的 listsetdict 等常用容器。该库的特点包括:

  1. 高效性:所有操作的时间复杂度均为 O(log n),远优于每次插入后再进行排序的 O(n log n)。
  2. 简单易用:API 设计与标准库类似,上手非常容易,开发者只需要稍微修改代码就能替换掉标准容器。
  3. 自动排序:在插入和删除元素时,容器会自动保持有序,无需额外的手动排序操作。
  4. 纯 Python 实现:该库无需依赖 C 扩展,因此可以轻松在各种平台上使用。

安装

在开始之前,你需要通过 pip 安装 sortedcontainers 库:

pip install sortedcontainers

安装完成后,你就可以在你的项目中使用它了。


标题2

🔴 SortedList - 有序列表

SortedListsortedcontainers 中的一个有序列表实现,它在元素插入、删除时会保持有序,同时能够提供快速的索引访问。

基本操作

from sortedcontainers import SortedList

# 创建一个 SortedList
sl = SortedList([3, 1, 4, 1, 5, 9, 2, 6])

# 自动排序后输出
print(sl)  # 输出: SortedList([1, 1, 2, 3, 4, 5, 6, 9])

# 插入元素
sl.add(7)
print(sl)  # 输出: SortedList([1, 1, 2, 3, 4, 5, 6, 7, 9])

# 删除元素
sl.remove(3)
print(sl)  # 输出: SortedList([1, 1, 2, 4, 5, 6, 7, 9])

# 访问元素(支持索引操作)
print(sl[0])  # 输出: 1

# 使用 bisect 方法查找元素的位置
index = sl.bisect_left(5)
print(index)  # 输出: 4(5 应该在索引 4 处插入)

SortedList 的主要特性

  • 自动排序:元素插入和删除后,列表会自动排序。
  • 索引访问:你可以像操作普通列表一样,通过索引访问元素。
  • 二分查找SortedList 提供了 bisect_leftbisect_right 等方法,方便进行二分查找操作。
  • 支持切片:可以直接对 SortedList 进行切片操作。

应用场景:排行榜

假设你需要实现一个游戏排行榜,玩家的得分会不断变化,我们可以使用 SortedList 来保持得分有序,快速插入和删除玩家。

players = SortedList([("Alice", 1200), ("Bob", 900), ("Charlie", 1350)])

# 添加一个新玩家
players.add(("David", 1100))

# 让 Bob 的得分提高
players.remove(("Bob", 900))
players.add(("Bob", 950))

# 输出排名
for rank, player in enumerate(players, 1):
    print(f"Rank {rank}: {player[0]} with score {player[1]}")

标题3

🔴 SortedDict - 有序字典

SortedDict 是一个保持键有序的字典。当你在标准库的 dict 中插入新键时,顺序取决于插入的顺序,而 SortedDict 始终按键的顺序存储。

基本操作

from sortedcontainers import SortedDict

# 创建一个 SortedDict
sd = SortedDict({"b": 2, "a": 1, "c": 3})

# 打印有序字典
print(sd)  # 输出: SortedDict({'a': 1, 'b': 2, 'c': 3})

# 插入新元素
sd["d"] = 4
print(sd)  # 输出: SortedDict({'a': 1, 'b': 2, 'c': 3, 'd': 4})

# 删除元素
del sd["b"]
print(sd)  # 输出: SortedDict({'a': 1, 'c': 3, 'd': 4})

# 访问元素
print(sd["c"])  # 输出: 3

SortedDict 的主要特性

  • 按键排序:无论键的插入顺序如何,SortedDict 始终按键的大小进行排序。
  • 类似标准字典:操作方式与 Python 内置的 dict 非常相似,支持增删改查等操作。
  • 键的二分查找:可以像 SortedList 一样,对键进行二分查找。

应用场景:事件调度

假设你在开发一款模拟城市建设的游戏,玩家可以安排各种建筑的建造时间,我们可以用 SortedDict 来管理按时间顺序排列的事件。

events = SortedDict()

# 添加建筑事件
events[5] = "建造房屋"
events[1] = "建造道路"
events[10] = "建造公园"

# 输出按时间顺序安排的事件
for time, event in events.items():
    print(f"时间 {time}: {event}")

标题4

🔴 SortedSet - 有序集合

SortedSetsortedcontainers 提供的一个有序集合实现,类似于 Python 的 set,但会保持集合中的元素有序。

基本操作

from sortedcontainers import SortedSet

# 创建一个 SortedSet
ss = SortedSet([3, 1, 4, 1, 5, 9, 2, 6])

# 自动排序后输出
print(ss)  # 输出: SortedSet([1, 2, 3, 4, 5, 6, 9])

# 插入新元素
ss.add(7)
print(ss)  # 输出: SortedSet([1, 2, 3, 4, 5, 6, 7, 9])

# 删除元素
ss.remove(5)
print(ss)  # 输出: SortedSet([1, 2, 3, 4, 6, 7, 9])

# 判断元素是否存在
print(4 in ss)  # 输出: True

SortedSet 的主要特性

  • 自动去重:与标准 set 一样,SortedSet 保证集合内没有重复元素。
  • 自动排序:集合中的元素始终保持有序。
  • 高效查找SortedSet 也提供了类似于 SortedList 的查找功能。

应用场景:独特元素的排序管理

假设你正在开发一个电子商务平台,用户可能会多次浏览同一产品。为了防止重复记录用户浏览过的产品并保持浏览记录的有序性,我们可以使用 SortedSet

viewed_products = SortedSet()

# 用户浏览了多个产品
viewed_products.update([101, 203, 101, 302, 203, 404])

# 输出用户浏览的产品,按产品 ID 排序
print("用户浏览过的产品:", viewed_products)

标题5

🥇 性能与应用

sortedcontainers 使用纯 Python 实现,但由于其内部采用了基于分块数组的高效算法,能够在实际应用中表现出与 C 实现的类似性能。常见的用法包括:

  1. 动态保持有序数据结构:当你需要一个容器时刻保持有序时,sortedcontainers 提供了高效的替代方案,避免了频繁的手动排序。
  2. **

事件调度与优先级队列**:SortedListSortedDict 非常适合管理按时间或优先级排序的任务或事件。
3. 快速查找和访问:二分查找、插入、删除操作的时间复杂度为 O(log n),在需要频繁操作有序数据的场景下,比使用标准容器更高效。


标题6

📥 下载地址


sortedcontainers 最新版 下载地址


标题7

💬 结语

sortedcontainers 是一个功能强大、灵活且高效的 Python 库,它为开发者提供了 SortedListSortedDictSortedSet 三种有序容器。在需要有序数据结构的场景中,sortedcontainers 能够显著简化代码逻辑并提高运行效率。它的 API 设计与标准容器相似,易于上手,并且能够在许多实际项目中替代 Python 的标准数据结构,尤其是在需要频繁插入、删除和查找的有序数据场景中。


标题8

📒 参考文献

  • sortedcontainers GitHub仓库

通过本文的介绍和代码示例,你现在应该对如何使用 sortedcontainers 来处理有序数据有了更深入的理解,并能够在你的项目中应用这些高效的数据结构来解决各种排序和优先级问题。


TheEnd


在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.2章节python中选择结构

选择结构主要通过if、elif(else if的缩写)和else语句来实现。这些语句允许程序根据条件执行不同的代码块。另外还有表达式中多个条件连接等。 一、基本语句if if 语句后面跟一个条件表达式,如果条件为真(True)&#…

Machine Learning Specialization 学习笔记(4)

文章目录 前言一、模型评估训练集常规训练集线性回归逻辑回归 交叉验证集 偏差与方差正则化 学习曲线数据集的添加(数据增强)迁移学习精确率与召回率 二、决策树基本概念决策树的工作原理决策树的优点决策树的缺点决策树算法的变体决策树在Python中的实现…

OpenCV4.8 开发实战系列专栏之 01- 环境搭建与图像读写

大家好,欢迎大家学习OpenCV4.8 开发实战专栏,长期更新,不断分享源码。 专栏代码全部基于C 与Python双语演示,专栏答疑群 请联系微信 OpenCVXueTang_Asst 本文关键知识点: 开发环境搭建、读取图像与显示图像,读取图像…

什么是换电连接器

换电连接器是一种高压连接器,安装在整车中,属于车载连接器。它利用导体和绝缘体的特性,将电能和数据信号从换电站设备传输到电动汽车的电池组,实现能源的快速补充。换电连接器通常由插头和插座两部分组成,通过精密的对…

紫光展锐 携手摩托罗拉在全球市场推出强竞争力5G手机moto G35

moto G35 5G亮点 ■ 高清视界:6.72英寸FHDLCD屏幕,120Hz高刷新率; ■ 震撼音效:配备立体声扬声器和杜比全景声Dolby Atmos; ■ 大师影像:5000万像素后置AI相机; ■ 强劲核芯:紫光…

计算机毕业设计Hadoop+Spark知识图谱美团美食推荐系统 美团餐厅推荐系统 美团推荐系统 美食价格预测 美团爬虫 美食数据分析 美食可视化大屏

《HadoopSpark知识图谱美团美食推荐系统》开题报告 一、引言 随着互联网技术的快速发展,大数据已成为企业竞争力的关键要素。美团作为国内领先的本地生活服务平台,拥有海量的用户行为数据和丰富的业务场景。为了进一步提升用户体验,提高推荐…

JVM内存区域详解及DirectByteBuffer内存

Java虚拟机(JVM)是Java程序运行的基础,它为Java程序提供了一个与平台无关的执行环境。JVM内存区域的划分对于理解Java程序的运行机制至关重要。本文将详细介绍JVM的内存区域,并探讨对外内存中的DirectByteBuffer。 方法区&#x…

炉石传说辅助攻略—VMOS云手机助攻:国服回归任务要点,哪个辅助更好?

在《炉石传说》中想要轻松完成各种任务并享受游戏的乐趣,VMOS云手机是您的最佳辅助工具!VMOS云手机为《炉石传说》提供了专属定制版的云手机,内置游戏安装包,不需要重新下载安装游戏,让您快速上手。更棒的是&#xff0…

Misc-流量分析基础

第一种:直接搜索flag字符串 第二种:flag进行了十六进制编码,通过十六进制编码解决 第三种:压缩包流量:tar.gz的压缩包可以直接在wireshark中解压查看,其他的压缩包则要将流量导出来,然后去解码…

微信小程序注册流程及APPID获取(完整版图文教程)

文章目录 前言1. 注册微信小程序账号1.1微信小程序注册1.2 点击注册按钮,进入小程序注册步骤。1.3 填写邮箱、密码、验证码1.4 用户信息登记1.5 微信扫码认证后,回到微信公众平台点击确认提交1.6 进小程序后台,完成注册 2.完善小程序账号信息…

力扣 困难 25.K个一组反转链表

文章目录 题目介绍题解 题目介绍 题解 先把链表的长度求出来,翻转前先判断剩余链表节点的个数,如果大于等于k则翻转,否则直接退出循环返回,每一个小组的翻转和上一题一样。 参考b站灵茶山艾府 class Solution {public ListNo…

汽车3d动画渲染选择哪个?选择最佳云渲染解决方案

面临汽车3D动画渲染挑战?选择正确的云渲染服务至关重要。探索最佳解决方案,优化渲染效率,快速呈现逼真动画。 汽车3d动画渲染选择哪个? 对于汽车3D动画渲染,选择哪个渲染器取决于你的项目需求、预算和期望的效果。Ble…

inBuilder零代码新版表单设计器特性一览

inBuilder零代码新版表单设计器正式上线,此次新版表单设计器相比旧版,优化了界面外观、提升了功能易用性、增加了许多新特性。下面跟随本文简要了解下零代码新设计器主要的几大新特性: 1. 优化设计器界面 新版设计器对表单上控件层级做了一…

素数判断-C语言

1.问题: 输入一个大于3的整数n,判断是否为素数(质数)。 2.解答: 对100-200之间的每一个数进行遍历,如果不能被3整除,就将此数输出,若能被3整除,就不输出此数。 3.代码&…

【CSP】2024第二轮前的准备工作

第二轮成绩还没出,估分有希望但不高,发个帖子涨rp 1. 大纲 目前最新版本2023版NOI大纲 ,字字珠玑要细品,比如这次CSP-J第一轮就考到了格雷编码,没有经历GESP逐级洗礼的普娃哪知道这个啊。 2.在线培训 金牌教练在线…

线程的状态及常用方法

1. 线程的状态 在Java程序中,一个线程对象通过调用start()方法启动线程,并且在线程获取CPU时,自动执行run()方法。run()方法执行完毕,代表线程的生命周期结束。在整个线程的生命周期中,线程的状态有以下6种&#xff1…

network-scripts目录下没有ens33文件的问题

作者:程序那点事儿 日期:2023/11/09 06:52 systemctl start NetworkManager #开启网络管理器nmcli con show #查看ens33网卡对应的是ifcfg-Wired_connection_3这个文件(网络管理器要开启,不然报错),或者根据…

分布式Redis(14)哈希槽

文章目录 一致性哈希算法理论普通哈希的问题一致性hash算法 Redis 使用哈希槽Redis Cluster集群 为什么Redis是使用哈希槽而不是一致性哈希呢?为什么Redis Cluster哈希槽数量是16384? 关键词:一致性 Hash,哈希槽, 带着…

双指针算法详解

什么是双指针 双指针算法是一种常用的算法策略,通常用于处理有序数组或链表,能够高效地解决许多问题。其核心思想是通过维护两个指针在数组或链表中移动,从而达到减少时间复杂度的目的。我们将通过三个示例代码来深入了解双指针算法的…

《动手学深度学习》笔记2.2——神经网络从基础→进阶 (参数管理-每层的权重/偏置)

目录 0. 前言 正文:参数管理 1. 参数访问 1.1 [目标参数] 1.2 [一次性访问所有参数] 1.3 [从嵌套块收集参数] 2. 参数初始化 2.1 [内置初始化] 2.2 [自定义初始化] 2.3 [参数绑定-共享参数] 3. 小结 4. 练习 0. 前言 课程全部代码(pytorch版…