只需四步,彻底掌握Python列表切片

对话框回复「导航」获取精选文章

与非学堂

专注青少年信息技术教育,探讨少儿编程的教与学,交流技巧、分享资源。

公众号

一、Python列表与索引

Python的列表是一种有序的数据结构,可以用索引编号进行访问。

比如:a = [1,4,6,2,9,0,5]

此时,如果运行:

print(a[2])

将得到a[2]的值:6。

注意,我们会经常说“索引”(index),它的意思与“编号”相似。在Python语言中,规定编号是从0开始的。

二、四步切片法

除了一次取出一个元素的值,Python还支持使用索引进行“切片”(大家可以想象一下面包切片):从原列表中按一定的规则,取出一些元素,形成一个新的列表。

按什么样的规则呢?

这个规则是由三个数字来确定的,我们分别用x、y、z来表示:x表示起点位置,y表示终点位置,而z表示挑选的方向和步长(每多少个数取一次)

具体怎么写呢?跟取出一个值的写法类似,写成a[x:y:z],用两个冒号将三个参数隔开。

比如:a = [1,4,6,2,9,0,5]

a[0:3:1]的值将是[1,4,6],而a[1:3:1]的值将是[4,6]。

为了让同学们一次理解这三个数字确定的规则,我们来看一个老师自创的“四步切片法”。

首先,让我们在草稿纸上,画出原始的列表a。

接着,问大家一个问题:如果将每个数字想象成一个同学,这7位同学排成了一队,现在又来了一个同学,要插入到这个队伍里,请问这个同学有多少个不同的位置可以去?

很好!相信大家已经很快看出了答案,7位同学的队伍里,插入一位新同学,他可以有8个不同的位置可以挑选。

咱们还是把他们的“编号”给标上。标上之后,咱们的“四步切片法”到底是怎么回事儿呢?

a = [1,4,6,2,9,0,5]

a[x:y:z]

2.1 确定方向

我们要看a[x:y:z]中的z,来确定取的方向。如果z是一个正数,取数的方向应该是按a的正方向,从前往后;而如果z是一个负数,那么取数的方向就应该是按a的反方向,从后往前地取了。

比如:

a[0:5:1],因为z是1,所以是正向的。

而a[4:1:-1],z是-1,所以取数的方向是a的反方向。

2.2 确定起点

a[x:y:z]中的x,可以确定我们取数的起点。而在确定这个起点位置时,大家不要把它想象成这个数对应的位置,而应该像刚才那个插入队伍的同学一样,思考列表里这个数字之间的位置。还有一个关键点要注意,不管是起点还是终点,都是看x和y所表示的编号的前面,而这个前面的意思,是指当前方向上的“前”。

比如:

a[0:5:1],因为z是1,所以是正向的,那么起点的确定就沿着a,从前往后地找,找到0的编号,它的“前面”的位置开始。

而a[4:1:-1],因为z是-1,是反向的,起点的位置怎么确定呢?我们就得沿着a相反的方向,从后往前地找,找到编号4,它的“前面”,不是在2和9之间,而是在9和0之间。起点要从这里开始。

2.3 确定终点

终点的确定与起点一样,找第1步确定的方向上,终点编号之前的位置就行了。

比如:

a[0:5:1],终点的位置,我们应该从前往后地看,找到编号5,它的“前面”,应当是9和0之间,在这里划一个记号,表示结束。

而a[4:1:-1],因为是反方向的,所以我们需要倒着看,从后往前,找到编号1的位置,它的“前面”,应当是4和6之间,而不是1和4之间,在这里划一个记号,表示结束。

2.4 确定步长

最后一步,就是确定在刚才确定的起点和终点位置的范围内,每几个数取一个,即“步长”是多少。

a[0:5:1]的步长为1,就是每1个取一个,意思就是个个都取,所以得到的结果是[1, 4, 6, 2, 9]。

a[4:1:-1]步长为-1,除了方向不同,从后往前,还是每个数都取,所以得到的结果是[9, 2, 6]。

而如果改一下,a[0:5:2]步长为2了,这时表示从起点位置开始,每2个数取一次,因此,从1开始,1、6、9,结果是[1,6,9]。

a[4:1:-2]步长变为-2了,表示从起点的位置开始,从后往前地看,每2个数取一次,因此,从9开始,9、6,没有了,结果是[9,6]。

三、负索引值

刚才我们只涉及到索引值为正数的情况。而实际上,Python还为列表元素提供了一套负数的索引值。规定最后一位元素的编号为-1,倒数第二位元素的编号为-2,以此类推。

如果在a[x:y:z]中,x和y存在负数索引值,情况又会怎样呢?

其实做法是一样的:确定方向、确定起点、确定终点、确定步长。

比如a[-4:-1:1],第三个数字1,确定了方向为正方向,从编号为-4的元素前面(即6和2之间)开始,到编号为-1的元素前面(即0和5之间)结束,步长是1,那得到的值就为[2, 9, 0]。

再比如a[-1:-6:-1],第三个数字为-1,表示沿a的反方向,从编号为-1的元素前面(即原a的队尾处)开始,到编号为-6的元素前面(即4和6之间),步长是-1,得到的最终结果为[5, 0, 9, 2, 6]。

思考:

a[-4:-1:-1]的值是什么?

因为方向是反的,所以沿a的反方向,从后往前取,编号为-4的元素为2,所以应该把2和9之间的位置作为起点;编号为-1的元素为5,所以应该把5后面这个空位作为终点,步长为-1,反着取。但是方向是从后往前,而终点却在起点“前面”,这样就没有办法取到任何数了。因此,a[-4:-1:-1]的值将是[ ]。

四、参数省略的情况

Python的发明人,为了让Python使用起来更加简便(同时也为了取到队首和队尾的数),还创造了参数可以省略的写法。

4.1 省略x

在a[x:y:z]中,x如果省略,写成a[:y:z]这种形式,表示x的值为“当前方向上所能找到的最靠前的位置”。请注意,这里一定是“当前方向上”。如果是正方向,那么x的默认值将是队首这个空位;如果是反方向,那么x的默认值将是队尾这个空位。

比如:

a[:4:1]将从队首,一直到编号为4的元素前面(即2和9之间的位置),所以它的值为[1, 4, 6, 2]。

而a[:-3:-1]将从队尾,一直到编号为-3的元素的“前面”(即9和0之间的位置),所以它的值是[5, 0]。

4.2 省略y

在a[x:y:z]中,y如果省略,写成a[x::z]这种形式,则表示y的值为“当前方向上所能找到的最靠后的位置”。如果是沿正方向取数,则将取到队尾,而如果是沿反方向取数,则将取到队首。

比如:

a[4::1],方向是正向,将从编号为4的元素的前面(2和9之间),一直取到队尾,所以它的值为[9, 0, 5]。

a[-3::-1],方向是反向,将从编号为-3的元素的前面(即9和0之间),一直取到队首,所以它的值是[9, 2, 6, 4, 1]。

4.3 省略z

在a[x:y:z]中,如果z省略,z将获得默认值1。如a[4::]与a[4::1]的值是一样的。

如果省略z,那么可以少写一个冒号,写成a[4:],与a[4::]与a[4::1]的值是一样的。但是此时虽然y也省略了,但是x和y之间的冒号不可以再省略,如果省略就变成了a[4]就不是切片,而是只取其中一个元素了。

五、练习

相信大家已经基本掌握了“四步切片法”。到底掌握得如何呢?这里我们提供了一些练习,大家先在纸面上完成,然后再在电脑上验证吧!

a = [1,2,3,4,5,6,7,8]

a[2:6:1]

a[2:6:2]

a[2:6:3]

a[6:2:-1]

a[6:2:-2]

a[6:2:-3]

a[2:6]

a[6:2]

a[2:-4:1]

a[-4:2:-1]

a[:5:2]

a[:5:3]

a[:-2:-1]

a[:-3:-1]

a[:-4:-2]

a[6::2]

a[6::-2]

a[:1:-1]

a[-2::-2]

a[::3]

a[3:-2]

a[:-3]

a[4:-4:-4]

a[:-1:-1]

a[::-1]

a[::]

— OVER —

与非学堂

专注青少年信息技术教育,探讨少儿编程的教与学,交流技巧、分享资源。

公众号

一份自家广告,长期有效|咨询&合作


公众号对话框回复「HELP」更多精彩

喜欢就请「分享「点赞「在看」吧!

  • 19
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python列表切片是从原始列表中提取列表的一部分的过程。在列表切片中,我们可以根据要指定切片的开始位置、结束位置和步长来剪切列表。通过使用切片操作,我们可以轻松地获取列表中的特定元素子集。 举个例子,如果我们有一个列表`ll = [5, 17, 13, 14, 8, 19, 3, 7, 9, 12]`,我们可以使用切片操作来提取其中的一部分元素。例如,如果我们想提取列表中的前三个元素,我们可以使用切片`ll[:3]`,这将返回一个新的列表`[5, 17, 13]`。同样地,我们也可以使用切片操作来获取列表中的后几个元素,比如`ll[5:]`将返回列表中从索引5开始到末尾的所有元素。 除了提取元素,我们还可以通过切片操作来删除和插入多个元素。例如,我们可以使用切片操作`ll[5:] = []`将列表中的后几个元素删除,或者使用切片操作`ll[:0] = ['a', 'b']`将元素`'a'`和`'b'`插入到列表的开头。 总结起来,Python列表切片是一种灵活的操作,可以方便地对列表进行切割、删除和插入操作,使得我们可以更加高效地处理列表数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python 列表切片详解](https://blog.csdn.net/hlx20080808/article/details/127610664)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值