python中SortedList类的用法详解

ops/2024/10/11 13:26:01/

SortedList类是python第三方库sortedcontainers中的提供的一种高效的方式来存储有序的元素集合,同时支持快速的插入、删除和查找操作。

SortedList类的特点:
1.排序列表的值始终保持有序。
2.排序列表中的值必须可以比较。
3.值的总顺序在存储于排序列表期间不得改变。
4.插入、删除和查找操作的时间复杂度通常是对数级别的,这比标准列表的线性时间复杂度要好得多,特别是在处理大量数据时。
5.特别适用于需要频繁进行插入、删除和查找操作,同时需要保持元素排序的场景,如优先级队列、数据排序、范围查询等。

使用SortedList类,首先需要安装第三方库sortedcontainers:

pip install sortedcontainers

在使用的时候,从sortedcontainers导入SortedList类:

python">from sortedcontainers import SortedList

SortedList类提供的添加值的方法:add、update

  • add(value),添加单个元素到有序列表,value为要添加的值
python">s = SortedList()
s.add(1)
s.add(2)
print("add元素后:{}".format(s))

在这里插入图片描述

  • update(iterable),将可迭代对象,全部更新到有序列表,iterable为可迭代对象,如列表
python">s = SortedList()
s.update([1,2,3,4,5,6])
print("update元素后:{}".format(s))

在这里插入图片描述

SortedList类提供的移除值的方法:clear、discard、remove、pop

  • clear(),清空列表
python">s1 = [2,6,4,5,7,8,9,0]
s2 = SortedList(s1)
print(s2)
s2.clear()
print("clear元素后:{}".format(s2))

在这里插入图片描述

  • discard(value),从列表中删除指定元素,如果元素存在,删除列表中的元素,元素不存在,也不会报错
python">s1 = [2,6,4,5,7,8,9,0]
s2.update(s1)
print(s2)
s2.discard(2)
print("discard元素2后:{}".format(s2))
s2.discard(11)
print("discard元素11后:{}".format(s2))

在这里插入图片描述

  • remove(value),删除有序列表中的元素,元素必须存在,否则报ValueError的错!!
python">s1 = [2,6,4,5,7,8,9,0]
s2.update(s1)
print(s2)
s2.remove(4)
print("remove元素4后:{}".format(s2))
s2.remove(1)
print("remove元素1后:{}".format(s2))

在这里插入图片描述

  • pop(index),移除索引为index的值,index为索引,默认为-1,移除最后一个,注意index值不能超出边界,否则会报IndexError的错
python">s2.clear()
s1 = [2,6,4,5,7,8,9,0]
s2.update(s1)
print(s2)
res = s2.pop()
print(res)
print("pop索引为-1的元素后:{}".format(s2))
res1 = s2.pop(2)
print(res1)
print("pop索引为1的元素后:{}".format(s2))

在这里插入图片描述
在这里插入图片描述
SortedList类提供的查找值的方法:bisect_left、bisect_right、count、index

  • bisect_left(value),返回要插入value值在有序列表中的索引,value为要插入的值,如果列表中已有相同元素,则插入最左侧
python">s3 = SortedList([1,3,2,4,6])
print("s3为:{}".format(s3))
v = s3.bisect_left(7)
print("bisect_left插入值为7的元素后:{}".format(v))
v1 = s3.bisect_left(2)
print("bisect_left插入值为2的元素后:{}".format(v1))

在这里插入图片描述

  • bisect_right(value),与bisect_left一样,返回要插入value值在有序列表中的索引,value为要插入的值,如果列表中已有相同元素,则插入最右侧
python">s4 = SortedList([1,3,2,4,6])
print("s4为:{}".format(s4))
v3 = s4.bisect_right(3)
print("bisect_right插入值为3的元素后:{}".format(v3))
v4 = s4.bisect_right(8)
print("bisect_right插入值为8的元素后:{}".format(v4))

在这里插入图片描述

  • count(value),返回元素在列表中的数量,元素不存在时返回0
python">s5 = SortedList([1,1,2,3,4])
print("s5:{}".format(s5))
v5 = s5.count(1)
print("元素1的count次数为:{}".format(v5))
v6 = s5.count(7)
print("元素7的count次数为:{}".format(v6))

在这里插入图片描述

  • index(self, value, start=None, stop=None),返回元素的在列表中的第一个索引,如果有start、stop,则统计这个范围内对应值的索引,默认为None,为列表中所有元素,元素不存在时报错
python">s6 = SortedList([1,1,2,3,4])
v7 = s6.index(1)
print("元素1的index为:{}".format(v7))
v8 = s6.index(1,start=1, stop=2)
print("元素1的index为:{}".format(v8))

在这里插入图片描述
SortedList类提供了一些迭代值的方法:irange、islice

  • irange(minimum=None, maximum=None, inclusive=(True, True),reverse=False),创建一个从 minimummaximum 的值迭代器。默认情况下,minimummaximum 都设置为 None,这自动包括了排序列表的开始和结束。参数 inclusive 是一个布尔值对,表示是否应将最小值和最大值包含在范围内。默认值为(True,True),使得范围包括最小值和最大值。当 reverseTrue 时迭代器中的值将以相反顺序生成;reverse 默认为 False
python">s7 = SortedList([1,2,3,4,5])
print("s7:{}".format(s7))
l = s7.irange(2,4, (True, True), False)
for i in l:print("i的值:{}".format(i))l1 = s7.irange(1,3, (False, True), True)
for i1 in l1:print("i1的值:{}".format(i1))

在这里插入图片描述

  • islice(start=None, stop=None, reverse=False),返回一个迭代器,该迭代器从startstop对排序列表进行切片。startstop 索引分别被视为包含和排除。默认情况下 startstop 都为 None,这会自动包含排序列表的开始和结束。reverse 默认为 False,当 reverseTrue 时迭代器中的值将以反序生成。
python">s8 = SortedList([1,2,3,4,5,6])
it = s8.islice(1,3, True)
for i in it:print("i的值{}".format(i))it1 = s8.islice(1, 3, False)
for j in it1:print("j的值{}".format(j))

在这里插入图片描述

SortedList类提供的copy方法

  • copy(),返回排序后的列表的浅拷贝
python">s9 = SortedList([1,2,3,4,3,2])
print("s9:{}".format(s9))
s10 = s9.copy()
print("s10:{}".format(s10))

在这里插入图片描述


http://www.ppmy.cn/ops/117122.html

相关文章

发票OFD格式转换成PDF

引入依赖&#xff0c;低版本的报错&#xff0c;2.0.2能够实现转换 <dependency><groupId>org.ofdrw</groupId><artifactId>ofdrw-converter</artifactId><version>2.0.2</version><exclusions><exclusion><groupId&g…

【设计模式-迭代】

定义 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于提供一种顺序访问集合对象元素的方式&#xff0c;而不暴露该对象的内部表示。通过迭代器&#xff0c;客户端可以在不需要了解集合实现的细节的情况下遍历集合中的元素。 UML图 …

有威胁的武器武装检测系统源码分享

有威胁的武器武装检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

【UI自动化】前言

系列文章目录 【UI自动化】前言 自动化不能代替手工测试&#xff0c;自动化都是以手工测试为基础&#xff0c;自动化测试实现的步骤要依赖手工&#xff1b; 文章目录 系列文章目录【UI自动化】前言 自动化测试的类型自动化解决的问题什么是UI测试测试分类一、使用UI自动化的…

[Python数据可视化]探讨数据可视化的实际应用:三个案例分析

数据可视化是理解复杂数据集的重要工具&#xff0c;通过图形化的方法&#xff0c;可以直观地展示信息、趋势和模式。本文将深入探讨三个实际案例&#xff0c;包括健康数据分析、销售趋势分析、城市交通流量分析。每个案例将提供假设数据、详细注释的代码及分析结果。 案例 1: …

harmonyos面试题

你在项目中用过线程通信吗&#xff0c;线程是怎么进行通信的? 页面的生命周期有哪些? UAbility的生命周期呢? 你在项目中使用首选项主要用来数什么 组件通信的方式有息些 弹室UI是怎么在页面UI中使用的 常用的修饰符有愿些介绍一下 缓冲区是什么与16进制和数组有什么关…

Subdominator:一款针对漏洞奖励计划的子域名安全枚举工具

关于Subdominator Subdominator是一款针对漏洞奖励计划的子域名安全枚举工具&#xff0c;可用于在漏洞搜寻和侦察过程中进行被动子域名枚举。它旨在通过高效枚举子域名和各种免费被动资源来帮助研究人员和网络安全专业人员发现潜在的安全漏洞。 Subdominator 与各种免费和付费…

Redis哈希类型详解:从基础命令到实际应用

引言 前边介绍了 Redis 中字符串类型&#xff0c;现在接上篇文章继续学习 Redis 哈希类型的命令和实际应用 哈希&#xff08;Hash&#xff09;类型是一种非常实用的数据结构&#xff0c;以字段-值对的形式存储多个键值对。这里将详细介绍 Redis 哈希类型的使用方法、内部编码…