第10讲:Python列表对象查操作之通过切片获取列表中的元素

news2024/11/27 16:30:52

文章目录

    • 1.切片获取列表中的技术要点
      • 1.1切片获取列表中的概念总结
      • 1.2.切片的语法格式以及含义
    • 3.使用切片方法获取列表中元素
      • 3.1.定义一个原始列表列表
      • 3.2.当step步长为正数时切片的案例
      • 3.3.当step步长为负数时切片的案例
      • 3.4.使用负数索引作为切片范围
    • 4.将切片后的列表赋值给新的变量
    • 5.切片操作获取列表中的多个元素允许索引越界
    • 6.调用slice函数方法实现切片获取列表元素的效果
    • 7.一次打印多个不连续的元素
    • 8.使用切片一次性打印列表的全部元素

1.切片获取列表中的技术要点

1.1切片获取列表中的概念总结

使用切片的方法获取列表中的一个或多个元素,是Python编程中经常要用的代码片段,一定要搞明白。

所谓的切片,指的是根据条件从列表中截取了一份片段,这个片段仍然是以列表的形式返回,简单理解为就是根据切片条件截取了列表中部分的元素。

在上面通过索引名一次我们只能获取一个列表元素,当使用切片的方法时,一次就可以获取列表中的多个元素。

切片的使用也非常简单,指定要获取的元素在列表中的索引范围,即可将这个索引号范围内的元素全部读取出来,使用切片获取列表中的索引时,声明的索引号范围一定是一个连续且有规律的,通过切片一次可以读取列表中的一个元素或者多个元素。

注意使用切片获取列表中的元素时,只能获取一个连续范围的索引所对应的元素,不能获取不连续的索引对应的元素,例如我想获取索引号为1/5/9的元素,这种需求切片是做不到的,切片只能读取到连续范围的索引对应的元素,例如获取索引号为1-5对应的元素。

1.2.切片的语法格式以及含义

切片可以不单单可以对列表进行切片,还可以对变量、字典、字符串等等进行切片。

print(列表名称[start:stop:step])

#start:起始索引号
#stop:结束索引号
#step:步长

例子:print(mylist[1:5:1])
#解释:打印出mylist列表中索引号1~5,但不输出索引5对应的元素,其他索引对应的元素都会被打印,步长为1。

在切片的语法中,有一些注意的点:

  • 在使用切片时,切片后得到的仍然是一个列表,切片后的列表只是原列表中的一部分。
  • 使用切片时指定了stop结束索引号,在得到的切片中不会包括stop结束索引对应的元素,切片只会截取start到stop范围之内索引对应的元素,会包括start起始索引对应的元素,不会包括stop结束索引对应的元素。
  • 使用切片时,如果不指定step步长,默认值为1,此时的切片语法格式可以简化成[start:stop]
  • 另外当step步长值为正数时:
    • 如果不指定start起始索引,切片的第一个元素默认是列表中的第一个元素。
    • 如果不指定stop结束索引,切片的最后一个元素默认是列表中的最后一个元素。
    • 如果指定了start、stop,当step为正数时,从start起始索引处,包含起始索引对应的元素,开始往后计算切片。
  • 另外当step步长值为负数时:
    • 如果不指定start起始索引,切片的第一个元素默认是列表中的最后一个元素。
    • 如果不指定stop结束索引,切片的最后一个元素默认是列表中的第一个元素。
    • 如果指定了start、stop,当step为负数时,从start起始索引处,包含起始索引对应的元素,开始往前计算切片。

在切片中,无论step是正数还是负数,只是切片的顺序不同,当step是正数时,切片会从start处向右(往后)开始切片,当step是负数时,切片会从start处向左(往前)开始切片。

在使用切片获取列表中的元素时,一般都使用大于0的索引作为范围,去读取列表中一个范围内的元素。

3.使用切片方法获取列表中元素

3.1.定义一个原始列表列表

image-20220728164429195

将上图中的列表定义出来,我在图中标记了列表中每个元素的索引号,下面我们通过切片获取元素时,就有了上图的参考依据。

##定义一个列表
mylist = ["jiangxl", "jiangxiaolong", "bjjtdx", "devops", "python", 11, 22, 33, 89]
print(list(mylist))

3.2.当step步长为正数时切片的案例

当step步长值为正数时:

  • 如果不指定start起始索引,切片的第一个元素默认是列表中的第一个元素。
  • 如果不指定stop结束索引,切片的最后一个元素默认是列表中的最后一个元素。
  • 如果指定了start、stop,当step为正数时,从start起始索引处,包含起始索引对应的元素,开始往后计算切片。

当step步长为正数时,切片的顺序是从列表的第一个元素向后找索引范围进行切片。

1)使用切片获取索引号1到7范围内的元素,并指定步长为2

分析:要获取索引1~7这几个索引对应的多个元素,需要通过切片来实现,使用切片时指定起始索引号为1,结束索引号为7,步长为2,切片是不会获取结束索引对应的元素,根据上图元素与索引的对应关系,本次需求获取的结果将会是:[jiangxiaolong, jsjkxjs, python]

#使用切片获取索引号1到7范围内的元素,并指定步长为2
print(mylist[1:7:2])
#输出结果:['jiangxiaolong', 'jsjkxjs', 'python']

指定的结束索引对应的元素不会列入切片后的列表中,相当于被切片的范围只是索引号16对应的元素,但是指定了步长为2(间隔为1),16索引号对应的元素每隔1位取一个元素划入到切片列表中,从而得到如下结果。

image-20220729101130832

切片的范围是索引17,但是结束索引不会被列入到切片的范围内,此时切片的范围仅是16这几个索引,步长为2间隔就为1,因此1~6这几个索引会每隔1位取一个,最终只会取出1/3/5这三个索引对应的元素,作为切片列表。

image-20220729101905081

2)使用切片获取索引1到7范围内的元素,不指定步长

分析:需求和上一个一样,只不过不指定步长,不指定步长时,步长值为1,间隔为0,此时就会打印出切片范围内索引对应的所有元素。

#使用切片获取索引1到7范围内的元素,不指定步长
'''
    在切片的语法格式中,存在三个参数:start:stop:step
    切片的三个参数可以选择性的使用,当不需要指定某个参数时:
        如果这个参数是start、stop,那么直接写上:就表示使用这个参数使用默认值,我们不指定该参数的具体值。
            例如:[6:](不指定stop的值)、[:6](不指定start的值)
        如果这个参数是step,可以写上:表示使用默认值,也可以省略不写,此时的切片语法格式就是[start:stop]
            例如:[6:11:]、[6:11]
    
'''
#两种写法:使用:声明step步长使用默认值,或者直接不写step参数
print(mylist[1:7:])
print(mylist[1:7])

#输出结果:['jiangxiaolong', 'bjjtdx', 'jsjkxjs', 'devops', 'python', 11]

image-20220729103717388

3)使用切片获取整个原列表中的所有元素

当不指定start起始索引和stop结束索引是,步长使用默认值,就会得到一个完整的原列表元素。

##切片整个原列表中的所有元素
print(mylist[::])

#输出结果:
['jiangxl', 'jiangxiaolong', 'bjjtdx', 'jsjkxjs', 'devops', 'python', 11, 22, 33, 89]

image-20220729104219846

3.3.当step步长为负数时切片的案例

当step步长值为负数时:

  • 如果不指定start起始索引,切片的第一个元素默认是列表中的最后一个元素。
  • 如果不指定stop结束索引,切片的最后一个元素默认是列表中的第一个元素。
  • 如果指定了start、stop,当step为负数时,从start起始索引处,包含起始索引对应的元素,开始往前计算切片。

当step步长为负数时,切片的顺序是相反的,从列表的最后一个元素向前找索引范围进行切片。

1)使用切片获取整个原列表中的所有元素,指定step步长为-1

当step步长为负数时,如果不指定start和stop,就会从列表中最后一个元素处向前一直到第一个元素处,进行切片,此时获取的切片列表就是和原列表完全反向。

print(mylist[::-1])

#输出结果:[89, 33, 22, 11, 'python', 'devops', 'jsjkxjs', 'bjjtdx', 'jiangxiaolong', 'jiangxl']

image-20220729105253027

2)使用切片获取索引8到0范围内的元素,指定步长为-2

分析:使用切片获取8~0索引对应的元素,从切片的范围上明显是一个反向范围的切片,步长为-2更说明了这一点,step步长为负数时,就会从指定的起始索引处向前(左)开始切片,结束索引依旧不会列入到切片列表中,如下图所示,反向切片后,从索引8处开始切片,结束索引0不列入切片中,步长的间隔为1,最终就会打印出索引8/6/2/4对应的元素。

image-20220729105649606

print(mylist[8:0:-2])

#输出结果;[33, 11, 'devops', 'bjjtdx']

当步长为负数时,从列表中反向切片,因此索引8对应的元素会打印在最前面,切片返回的也是一个列表,如果从中切片列表上看,索引8在切片后就会称为索引0。

image-20220729110106214

3)使用切片片获取0到8范围内的元素,指定步长为-2

分析:步长为负数,反向切片,0是起始索引,如前面的列表示意图所示,索引0前面没有任何元素了,作为负数步长来说,索引0是列表中的最后一个元素,而步长为-2,间隔就是1,那么此时是不会返回任何元素的,会返回一个空列表。

print(mylist[0:8:-2])

#输出结果:[]

4)切片时指定起始索引为5,不指定结束索引,指定步长为-2

分析:切片的起始索引为5,不指定结束索引,当步长为负数,默认的结束索引就是列表中的第一个元素,反向切片,步长为-2,间隔为1,每隔1位切片一个元素,最终索引5/3/1对应的元素会被切片出来。

image-20220729110653945

print(mylist[5::-2])

#输出结果:['python', 'jsjkxjs', 'jiangxiaolong']

image-20220729110823478

5)切片时不指定起始索引,指定结束索引为7,步长为-2

分析:当步长为负数时,不指定起始索引,默认是从列表中最后一个元素处切片,结束索引为7,那么范围就是最后一个元素索引到索引7之内的元素,步长为-2,那么间隔就为1,范围不大,最后只会打印出起始索引(最后一个元素)这一个元素。

image-20220729111153732

print(mylist[:7:-2])

#输出结果:[89]

image-20220729111227701

3.4.使用负数索引作为切片范围

列表中的元素都有2个索引,在3.3.2和3.3.3中,我们都是用元素的正数索引进行切片的,下面我用负数索引切片。(大多数情况下都是用正数索引作为切片范围的)

道理都一样,负数索引是从-1开始,值约小约靠后,值约大约靠前。

当步长为正数时,从指定的起始索引处向后开始切片,当步长为负数时,从指定的起始索引处向前切片。

1)步长为正数,使用负数索引作为切片范围

切片的范围从索引-10一直到索引-2,步长为正数2,从第一个索引-10处向后切片,一直到结束索引-2,-2不会列入到切片中,并且本次的步长为2,间隔就为1,最终索引-10、-8、-6、-4对应的元素会被切片出来。

-10到-2相当于0到8,一般都会用正数作为切片范围,看起来爽快。

image-20220729111807657

print(mylist[-10:-2:2])

#输出结果;['jiangxl', 'bjjtdx', 'devops', 11]

2)步长为负数,使用负数索引作为切片范围

切片的范围从索引-3一直到索引-9,步长为负数-2,从第一个索引-3处向后切片,一直到结束索引-9,-9不会列入到切片中,并且本次的步长为-2,间隔就为1,反向切片,最终索引-3、-5、-7对应的元素会被切片出来。

image-20220729112134625

print(mylist[-3:-9:-2])

#输出结果:[22, 'python', 'jsjkxjs']

4.将切片后的列表赋值给新的变量

使用切片从原列表中取出多个元素后,会形成一个新的列表,可以将切片后的列表赋给另一个变量。

mylist = ["jiangxl", "jiangxiaolong", "bjjtdx", "jsjkxjs", "devops", "python", 11, 22, 33, 89]
mylist2 = mylist[1:7:2]
print(mylist2)

#输出结果;['jiangxiaolong', 'jsjkxjs', 'python']

5.切片操作获取列表中的多个元素允许索引越界

什么是索引越界呢?指的是从列表中取元素时,指定的索引在列表中不存在,这就叫越界,在之前使用索引去元素时,当索引在列表中不存在时,就会抛出valueerror的异常。

当使用切片操作获取元素时,指定的索引在列表中不存在时,则不会报错,会将列表中能够承受范围的所有元素全部输出。

##列表中的最后一个元素的正数索引是9,我们通过切片指定结束索引是100,观察效果
print(mylist[:100])
#100索引在列表中不存在,且列表中的最大索引是9,此时Python就会将能够承受范围的全部元素输出出来,也就是会将列表中的全部元素输出
#输出结果:['jiangxl', 'jiangxiaolong', 'bjjtdx', 'jsjkxjs', 'devops', 'python', 11, 22, 33, 89]


##列表中的最大的负数索引是-10,也是列表中的第一个元素,我们通过切片指定起始索引是-100,观察效果
print(mylist[-100:])
#此时也会将全部元素输出出来:['jiangxl', 'jiangxiaolong', 'bjjtdx', 'jsjkxjs', 'devops', 'python', 11, 22, 33, 89]

6.调用slice函数方法实现切片获取列表元素的效果

调用slice函数方法也可以实现切片获取列表多个元素的效果,slice函数的输出结果和切片操作是相同的。

调用slice函数有三种方式:

  • 只指定stop结束索引。
  • 指定start起始索引和stop结束索引。
  • 指定start起始索引和stop结束索引以及step步长。

slice函数的语法格式:

slice(stop)
slice(start,stop)
slice(start,stop,step)

对于slice函数而言:start、stop、step三个参数的值都是None,并没有默认实际值

1)定义一个列表

mylist = ["jiangxl", "jiangxiaolong", "bjjtdx", "devops", "python", 11, 22, 33, 89]
print(list(mylist))

2)获取索引1到7范围内的元素,并指定步长为2

#切片实现
print(mylist[1:7:2])
#slice函数实现
print(mylist[slice(1,7,2)])

image-20220729114626202

3)获取列表中全部的元素

#切片实现
print(mylist[::])
#slice函数实现
print(mylist[slice(None, None, None)])

image-20220729114815047

4)获取索引1到7范围内的元素,不指定步长

#切片实现
print(mylist[1:7])

#slice函数实现
print(mylist[slice(1,7)])
print(mylist[slice(1,7,None)])

image-20220729115110757

5)仅指定结束索引

在切片操作中,如果只指定结束索引,步长是正数,那么起始索引默认是从列表中第一个元素处开始切片,slice函数也是相同的原理,如果起始索引start为None,步长为None或者正数,默认也是从列表的第一个元素处开始切片。

#切片实现
print(mylist[:8])
print(mylist[:-8])

#slice函数实现
print(mylist[slice(8)])
print(mylist[slice(-8)])
print(mylist[slice(None, 8, None)])

image-20220729115501221

7.一次打印多个不连续的元素

如果我们想打印列表中的多个元素,且元素的索引不是连续的,无法通过切片来打印,基于这种情况,也可以使用笨方法,如下所示打印多个元素,一般情况下,要么遍历列表中的所有元素,要么也是通过切片打印连续的多个元素,很少有这种需求。

print([mylist[2], mylist[5]])

mylist3 = [mylist[2], mylist[5]]
print(mylist3)

8.使用切片一次性打印列表的全部元素

mylist = ["jiangxl", "linux", "k8s", "devops", 789, 987]
print(mylist[:])

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

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

相关文章

【收藏】安科瑞企业微电网能效管理系统云平台演示账号

安科瑞 李亚俊 Acrel8757 1、AcrelCloud-1000变电所电力运维云平台 网址:https://acrelcloud.cn/ 演示账号:acrel 密码:123456 2、SCADA电力监控系统 网址:http://scada.acrel-eem.com/ 演示账号:acrel 密码:…

【手把手】教你玩转SpringCloud Alibaba之Nacos Config深入

1、不同环境相同配置问题-自定义Data ID配置 在实际的开发过程中,项目所用到的配置参数有的时候并不需要根据不同的环境进行区分,生产、测试、开发环境所用到的参数值是相同的。怎么解决同一服务在多环境中,引用相同的配置的问题&#xff1f…

Spring Security(7)

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~ 有时某些业务或者功能,需要在用户请求到来之前就进行一些判断或执行某些动作,就像在Servlet中的FilterChain过滤器所做的那样&#xff0c…

A Self-Attentive model for Knowledge Tracing论文笔记

原文链接和代码链接A Self-Attentive model for Knowledge Tracing | Papers With Code motivation:传统方法面临着处理稀疏数据时不能很好地泛化的问题。 本文提出了一种基于自注意力机制的知识追踪模型 Self Attentive Knowledge Tracing (SAKT)。其本质是用 Tra…

我的创作二周年纪念日

我的创作二周年纪念日 文章目录我的创作二周年纪念日机缘最初成为创作者的初心:1. 自我简介2. 日常学习过程中的记录收获在创作的过程中都有哪些收获?1. 获得了多少粉丝的关注?2. 获得了多少正向的反馈,如赞、评论、阅读量?3. 认识和哪些志同道合的领域同行?日常…

剑指Offer专项突破版(76)—— 数组中的第 k 大的数字

题目 剑指 Offer II 076. 数组中的第 k 大的数字 思路 假设有个划分函数divide: divide:将num在[l,r]范围内,按照nums[l]进行划分,返回一个数组range,划分为: 所有小于nums[l]的数:移动到nu…

nginx连接前后端分离项目 或 负载均衡映射多个服务器

nginx的两种用法: 打通前后端项目,前后端分离的项目,通过nginx建立连接 负载均衡,一台机器请求转发至多个服务器 1. 前后端分离项目,打通前后端项目 前端项目中的配置: 后端项目的ip和端口号就是正常的 …

verilog实现分频(奇数分频和偶数分频,通用版)

大家好,最近写了一些分频器的设计,发现奇数分频和偶数分频是比较常用分频效果,所以写了一个比较简单的分频代码,适用于奇数分频和偶数分频(不考虑占空比),代码已经经过测试,需要可自…

微服务框架 SpringCloud微服务架构 5 Nacos 5.7 Nacos 与 Eureka 的对比

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构5 Nacos5.7 Nacos 与 Eureka 的对比5.7.1 Nacos 注册中心细节分析5.7.2 临…

基于马科维茨与蒙特卡洛模型的资产最优配置模型(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 资本是保险公司经营的核心要素,是资产配置的重要约束条件。本文在马克维茨方法的基础上,将偿付能力引入了资产配置的优化模型。…

VH6501模板工程介绍(一)

VH6501硬件结构 1.式样 1.正向有5个灯,用来指示干扰的触发状态,干扰类型(数字或模拟),通道通信以及设备状态。 2.两个DB9接口(公头male和母头female),这是CAN或CANFD通道&#xff0…

(二)Java 线程

一、创建和运行线程 1. 方法一,直接使用 Thread Slf4j(topic "c.Test1") public class Demo {public static void main(String[] args) {Thread t new Thread(){Overridepublic void run() {log.debug("running");}};t.setName("t1&qu…

Casein-PEG-Indocyanine green 络蛋白-聚乙二醇-吲哚菁绿 Casein-ICG

产品名称:络蛋白-聚乙二醇-吲哚菁绿 英文名称:Casein-PEG-Indocyanine green 质量控制:95% 原料分散系数PDI:≤1.05 存储条件:-20C,避光,避湿 用 途:仅供科研实验使用,…

【免杀前置课——Windows编程】十三、事件与信号量——事件与互斥体区别、操纵信号量实现游戏多开访问控制(附代码)

事件 事件可以完全控制,其他无法控制线程的执行顺序,但是事件对象可以做到。 ***事件(Event)***是在线程同步中最常使用的一种同步对象,事件包含一个使用计数,一个是用来表示自动重置/手动重置的布尔值,另…

[附源码]计算机毕业设计springboot高校后勤保障系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]计算机毕业设计springboot个性化名片网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

MySQL的索引与事务

目录 1.索引的本质 2.索引的使用 2.1查看索引 2.2创建索引 2.3删除索引 3.索引的数据结构 3.1B树 3.2B树 4.事务 4.1 事物的回滚(rollback) 4.2 事务的四大特性(ACID) 4.2.1 原子性 4.2.2 一致性 4.2.3 持久性 4.2.4 隔离性 5.并发引起的问题 5.1 "读脏数…

IDEA中debug启动报错Method breakpoints may dramatically slow down debugging

1.原因:是因为我们打断点太多了,可能在mapper或者service层打了断点导致启动失败 解决方案:1.去掉所有我们打的断点, 2.去掉mapper或者service中我们打的错误断点

学习swagger,使用正则改造项目, 生成接口文档

学习swagger,使用正则改造项目 关于SwaggerKnife4j生成统一接口文档教程请点击以下关于SwaggerKnife4j生成统一接口文档 1 关于构建swagger文档所需要的依赖和配置类 SwaggerKnife4j - 统一接口文档 我们以某一个项目的swagger升级改造为例。 2 如何使用正则表达…

Discourse 的左侧边栏可以修改吗

在默认的 Discourse 配置中,我们左侧的边栏可以根据自己的要求进行修改吗? 解决办法 针对自己登录的用户,你是可以自己调整左侧边栏的配置。 单击右上角你的个人头像,然后选择属性。 在切换的界面中,选择属性。 在出…