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

在这里插入图片描述

在日常的 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.rhkb.cn/news/431916.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络32——Linux-文件io-2文件系统

1、阻塞和非阻塞 想要将文件以非阻塞方式打开,有两种方式 (1)需要将文件关闭,再用非阻塞方式打开 (2)fctnl函数,先获取旧属性,再添加一个新属性 阻塞函数 阻塞函数一直在等待输入…

从更底层的角度理解网站的访问过程

文章目录 1.示例,访问www.baidu.com是如何返回数据的1.输入www.baidu.com回车2.检查本机的C:\Windows\System32\drivers\etc\hosts配置文件夹下有没有这个域名对应的映射: 1.示例,访问www.baidu.com是如何返回数据的 1.输入www.baidu.com回车…

开源数据集网站合集

一.Google数据集 链接:https://datasetsearch.research.google.com/ 二.Huggingface数据集 链接1:GitHub - huggingface/datasets: 🤗 The largest hub of ready-to-use datasets for ML models with fast, easy-to-use and efficient dat…

深入解析:HTTP 和 HTTPS 的区别

网络安全问题正变得日益重要,而 HTTP 与 HTTPS 对用户数据的保护十分关键。本文将深入探讨这两种协议的特点、工作原理,以及保证数据安全的 HTTPS 为何变得至关重要。 认识 HTTP 与 HTTPS HTTP 的工作原理 HTTP,全称超文本传输协议&#xf…

2-103 基于matlab的光电信号下血氧饱和度计算

基于matlab的光电信号下血氧饱和度计算,光转换成电信号时,由于动脉对光的吸收有变化而其他组织对光的吸收基本不变,得到的信号就可以分为直流DC信号和交流AC信号。提取AC信号,就能反应出血液流动的特点。这种技术叫做光电容积脉搏…

如何查看线程

1、首先找到我们的电脑安装jdk的位置,这里给大家展示一下博主本人的电脑jdk路径下的jconsole位置。 2、 ok,那么找到这个jconsole程序我们直接双击打开就可以查看我们电脑的本地进程: jconsole 这里能够罗列出你系统上的 java 进程&#xff0…

[Linux] Linux操作系统 进程的状态

标题:[Linux] Linux操作系统 进程的状态 个人主页:水墨不写bug (图片来源于网络) 目录 一、前置概念的理解 1.并行和并发 2.时间片 3.进程间具有独立性 4.等待的本质 正文开始: 在校的时候,你一定学过《…

java 框架组件

Java 框架是一系列预先编写好的、可复用的软件组件,它们旨在帮助开发者快速构建高质量的应用程序。Java 社区拥有众多优秀的框架,涵盖了从 Web 开发到大数据处理的各个领域。下面是一些流行的 Java 框架及其主要用途: Spring框架:…

新手教学系列——非正常关机导致MySQL权限表(db)损坏及修复详解

在使用MySQL的过程中,我们常常会遇到一些问题,尤其是当服务器或主机非正常关机或重启时,MySQL的某些表,特别是权限表(如 mysql.db 表),可能会损坏,导致数据库无法启动或访问。这种情况对生产环境的数据库系统来说是相当严重的,因此掌握修复方法非常重要。 本篇文章将…

【STM32系统】基于STM32设计的DAC输出电压与ADC检测电压系统(简易万用表,检测电压电流)——文末工程资料下载

基于STM32设计的DAC输出电压与ADC检测电压系统(简易万用表,检测电压电流) 演示视频: 基于STM32设计的DAC输出电压与ADC检测电压系统(简易万用表,检测电压电流) 前言:本项目实现对STM32的DAC和ADC的程序设计与硬件电路连接实现STM32内部DAC输出电压,并且ADC可以采集电压…

下载2001年版英特尔开发手册与使用网易有道词典

本专栏的任务,是翻译2001年版英特尔开发手册的第3卷。上一节,我写了开篇语。本节,我是打算将这个版本的英特尔开发手册的下载方式公布出来。使得大家可以将其下载回去。如果你看的块的话,你可以自行翻译与学习。 一. 下载英特…

macOS设置 Redis自启动

macOS自定义开机启动程序 1、打开 自动操作app里面的应用程序 过程资料 1、https://juejin.cn/post/7123098435254747149 2、https://blog.twofei.com/889/ 2、编写脚本,可以点击右上角运行测试,保存为 app https://juejin.cn/post/7123098435254747149…

招联金融2025校招内推喇

【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 深圳,武汉: 后台开发 前端开发 数据开发 数据运营…

在MySQL中,要查询所有用户及其权限,您可以使用以下命令:

文章目录 1、查询所有用户1.1、登录数据库1.2、select user,host from mysql.user; 2、查看用户的权限 1、查询所有用户 1.1、登录数据库 [rootlocalhost ~]# docker exec -it spzx-mysql /bin/bash rootab66508d9441:/# mysql -uroot -p123456 mysql: [Warning] Using a pas…

什么是电商云手机?可以用来干什么?

随着电商行业的迅速发展,云手机作为一种创新工具正逐渐进入出海电商领域。专为外贸市场量身定制的出海电商云手机,已经成为许多外贸企业和出海电商卖家的必备。本文将详细介绍电商云手机是什么以及可以用来做什么。 与国内云手机偏向于游戏场景不同&…

Elasticsearch导出导入数据

1.概念回顾 2.基础操作 展示详细信息 GET:http://127.0.0.1:9200/_cat/indices?v Java代码将文件导入到ES package com.Graph.medicalgraph;import org.apache.http.HttpHost; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.act…

Linux 下安装mysql

1.检查之前是否安装过mysql rpm -qa | grep mysql 如果之前安装过,删除之前的安装包 rpm -e 安装包 如果没有,进行后续安装 2. 下载 MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ 3…

FPGA IP 和 开源 HDL 一般去哪找?

在FPGA开发的世界中,IP核和HDL模块是构建复杂数字系统的基石。它们如同乐高积木,让开发者能够快速搭建和重用经过验证的电路功能。但你是否曾感到迷茫,不知道从哪里寻找这些宝贵的资源?本文将为你揭开寻找FPGA IP核和HDL模块资源的…

Kafka 下载安装及使用总结

1. 下载安装 官网下载地址:Apache Kafka 下载对应的文件 上传到服务器上,解压 tar -xzf kafka_2.13-3.7.0.tgz目录结果如下 ├── bin │ └── windows ├── config │ └── kraft ├── libs ├── licenses └── site-docs官方文档…

gitlab/极狐-离线包下载地址

如果想要使用Gitlab/极狐进行数据的恢复,只能使用相同版本或者相近版本的安装包,因此有时候需要到它的官网上下载对应版本的安装包,以下是我收集到的对应地址的下载路径: Gitlab Gitlab离线库, https://packages.gitl…