深入解析Python 中的 sortedcontainers 库:高效的排序数据结构
在日常的 Python 编程中,列表(list
)、集合(set
)和字典(dict
)是常用的数据结构。然而,在某些特定的场景下,我们需要对数据进行排序,并且希望在插入、删除或访问元素时能够保持有序。在标准库中,虽然我们可以通过 list.sort()
或者 sorted()
函数对列表进行排序,但这些操作每次都需要 O(n log n) 的复杂度,这对一些高频操作来说效率并不理想。
sortedcontainers
是一个高效的 Python 库,它为开发者提供了三种主要的容器数据结构,分别是 SortedList
、SortedDict
和 SortedSet
,能够在 O(log n) 的时间复杂度下完成插入、删除和访问操作,并且自动保持元素的有序性。在本文中,我们将详细介绍 sortedcontainers
库的核心功能,展示如何利用它的高效数据结构解决一些常见的编程问题。
⭕️宇宙起点
- ❓ 为什么选择 `sortedcontainers`?
- 安装
- 🔴 SortedList - 有序列表
- 基本操作
- SortedList 的主要特性
- 应用场景:排行榜
- 🔴 SortedDict - 有序字典
- 基本操作
- SortedDict 的主要特性
- 应用场景:事件调度
- 🔴 SortedSet - 有序集合
- 基本操作
- SortedSet 的主要特性
- 应用场景:独特元素的排序管理
- 🥇 性能与应用
- 📥 下载地址
- 💬 结语
- 📒 参考文献
❓ 为什么选择 sortedcontainers
?
sortedcontainers
是一个轻量级且高效的库,提供了自动排序的数据结构,能够替代 Python 标准库中的 list
、set
和 dict
等常用容器。该库的特点包括:
- 高效性:所有操作的时间复杂度均为 O(log n),远优于每次插入后再进行排序的 O(n log n)。
- 简单易用:API 设计与标准库类似,上手非常容易,开发者只需要稍微修改代码就能替换掉标准容器。
- 自动排序:在插入和删除元素时,容器会自动保持有序,无需额外的手动排序操作。
- 纯 Python 实现:该库无需依赖 C 扩展,因此可以轻松在各种平台上使用。
安装
在开始之前,你需要通过 pip
安装 sortedcontainers
库:
pip install sortedcontainers
安装完成后,你就可以在你的项目中使用它了。
🔴 SortedList - 有序列表
SortedList
是 sortedcontainers
中的一个有序列表实现,它在元素插入、删除时会保持有序,同时能够提供快速的索引访问。
基本操作
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_left
和bisect_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]}")
🔴 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}")
🔴 SortedSet - 有序集合
SortedSet
是 sortedcontainers
提供的一个有序集合实现,类似于 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)
🥇 性能与应用
sortedcontainers
使用纯 Python 实现,但由于其内部采用了基于分块数组的高效算法,能够在实际应用中表现出与 C 实现的类似性能。常见的用法包括:
- 动态保持有序数据结构:当你需要一个容器时刻保持有序时,
sortedcontainers
提供了高效的替代方案,避免了频繁的手动排序。 - **
事件调度与优先级队列**:SortedList
和 SortedDict
非常适合管理按时间或优先级排序的任务或事件。
3. 快速查找和访问:二分查找、插入、删除操作的时间复杂度为 O(log n),在需要频繁操作有序数据的场景下,比使用标准容器更高效。
📥 下载地址
sortedcontainers 最新版 下载地址
💬 结语
sortedcontainers
是一个功能强大、灵活且高效的 Python 库,它为开发者提供了 SortedList
、SortedDict
和 SortedSet
三种有序容器。在需要有序数据结构的场景中,sortedcontainers
能够显著简化代码逻辑并提高运行效率。它的 API 设计与标准容器相似,易于上手,并且能够在许多实际项目中替代 Python 的标准数据结构,尤其是在需要频繁插入、删除和查找的有序数据场景中。
📒 参考文献
- sortedcontainers GitHub仓库
通过本文的介绍和代码示例,你现在应该对如何使用 sortedcontainers
来处理有序数据有了更深入的理解,并能够在你的项目中应用这些高效的数据结构来解决各种排序和优先级问题。
相关文章:

深入解析Python 中的 sortedcontainers 库:高效的排序数据结构
在日常的 Python 编程中,列表(list)、集合(set)和字典(dict)是常用的数据结构。然而,在某些特定的场景下,我们需要对数据进行排序,并且希望在插入、删除或访问…...

什么是服务器日志,日志有什么作用?
前言 服务器日志是指服务器等电脑设备或软件的运作记录。这些日志记录了服务器接收客户端处理请求的过程以及服务器对这些请求的处理结果。服务器日志对于排查和解决计算机系统和网络应用中的问题至关重要,因为它们包含了用于调试问题的消息、服务器状态以及其他…...
Codeforces Round 971 (Div. 4)A-G1题解
Codeforces Round 971 (Div. 4) A 就是b - a #include <bits/stdc.h> #define int long longusing namespace std;void solve() {int a, b;cin >> a >> b;cout << b - a << endl; }signed main() {ios::sync_with_stdio(false);cin.tie(0);co…...

QT----基于QML的计时器
赶上了实习的末班车,现在在做QML开发,第一天的学习成果,一个计时器.逻辑挺简单的,纯QML实现,代码在仓库,可以对比文档和提交记录学习起来更清晰 QT-Timer 学习使用c的listmodel 学习使用了如何用c的listmodel来存储数据. 新建一个TImeListModel类继承自QAbstractListModel c…...
Stable Diffusion的高分辨率修复(Hires.fix)
Stable Diffusion的高分辨率修复(Hires.fix)是一项重要的功能,它旨在提高生成图像的分辨率和细节,从而使画面变得更加清晰和精细。以下是关于Stable Diffusion高分辨率修复(Hires.fix)的详细解释࿱…...

智慧体育馆可视化:实时监控与智能管理
利用图扑可视化技术实现对体育馆的实时监控和数据分析,提升运营效率、观众体验和安全管理水平,打造智能化场馆环境。...

【NLP】基于“检测器-纠错器”中文文本纠错框架
前言 许多方法将中文拼写纠正(检测和纠正给定中文句子中的错误字符)视为序列标注任务,并在句子对上进行微调。一些方法使用错误检测器作为初步任务,然后将检测结果用于辅助后续的错误纠正过程。然而,现有方法在使用检…...
vue 中加载 Mapbox GL JS Examples
Mapbox GL JS 示例 1. Mapbox GL JS的基础使用2. style 的使用2.1. 切换 style2.2. 配置一个第三方 style (添加一个Layer)2.3. 配置一个带有 slot 的 style2.4. 创建一个自定义 style 的 layer 类实现 WebGL 内容2.5. 添加Marker2.6. 添加 geojson 格式…...

Vue3 中组件传递 + css 变量的组合
文章目录 需求效果如下图所示代码逻辑代码参考 需求 开发一个箭头组件,根据父组件传递的 props 来修改 css 的颜色 效果如下图所示 代码逻辑 代码 父组件: <Arrow color"red" />子组件: <template><div class&…...

秋分之际,又搭建了一款微信记账本小程序
在这个金色的季节里,每一粒粮食都蕴含着生命的奇迹,每一片叶子都在诉说着成长的故事。秋分之际,又搭建了一款微信记账本小程序。 产品概述 微信记账本小程序是一款便捷的个人财务管理工具,旨在帮助用户轻松记录、管理和分析日常…...

聚合函数count 和 group by
count函数: count(列名) SELECT COUNT(sid) FROM grade 统计列中所有的数值个数,会忽略null值。 count(*)和count(1) SELECT COUNT(*) FROM grade SELECT COUNT(1) FROM grade 统…...

Vue的工程化和element快速入门
vue项目的创建: vue项目的启动方式: vue项目开发流程: 代码示例: <!-- <script>//写数据export default{data(){return{msg: 上海}}} </script> --><script setup>import {ref} from vue;//调用ref函数&…...
【Kubernetes】常见面试题汇总(三十一)
目录 83.简述你知道的 K8s 中几种 Controller 控制器并详述其工作原理。简述 ingress-controller 的工作机制。 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 …...
在 Windows 上安装和配置 NVIDIA 驱动程序、CUDA、cuDNN 和 TensorRT
在 Windows 上安装和配置 NVIDIA 驱动程序、CUDA、cuDNN 和 TensorRT 1. 安装 NVIDIA 图形驱动程序2. 安装 CUDA Toolkit3. 安装 cuDNN4.安装 TensorRT5. 常见问题1. 安装 NVIDIA 图形驱动程序 首先需要安装兼容 CUDA 的 NVIDIA 驱动程序。 下载最新驱动: 访问 NVIDIA 官网,…...
京准电钟:NTP网络校时服务器助力校园体育场馆
京准电钟:NTP网络校时服务器助力校园体育场馆 京准电钟:NTP网络校时服务器助力校园体育场馆 体育场馆数字时钟系统可为观众及工作人员提供标准时间信息,为计算机及其他系统提供标准时间源,为协调场馆各业务系统与各部门的工作提供…...

9.25度小满一面
1.map的底层 2.unorder_map哈希表有自己实现过吗?哈希冲突 3.poll和epoll和select的优缺点、 4.线程同步机制是用来做什么的? 5.五子棋项目问题-- 算法题: 6.LeetCode.重排链表 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0…...

mysql批量修改表前缀
现有表前缀xh,批量修改为fax_需要怎么做 SELECTCONCAT(ALTER TABLE ,table_name, RENAME TO fax_,substring(table_name, 3),;) FROMinformation_schema. TABLES WHEREtable_name LIKE xh_%; 运行之后可以但是生成了一批修改表明的命令 此时批量复制执行就可实现批量修改表前…...

算法复杂度
1. 数据结构前⾔ 1.1数据结构 数据结构是计算机存储数据,组织数据的方式,指相互之间存在⼀种或多种特定关系的数 据元素的集合。常见的数据结构有线性表,树,图,哈希等。 1.2 算法 算法是一种计算过程,输…...

vue到出excel
安装 npm install exceljs npm install file-saver<template><button click"dade66">导出 66</button> </template><script> import ExcelJS from exceljs; import { saveAs } from file-saver;export default {data() {return {data…...

【延时队列的实现方式】
文章目录 延时队列JDK自带的延时队列实现Redis实现延迟队列RabbitMQ 延时队列 延时队列 延时队列是一种特殊类型的队列,它允许元素在特定时间间隔后才能被处理。这种队列在处理具有延迟需求的任务时非常有用,例如定时任务、事件驱动系统等 延时队列在项…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...