赞
踩
对话框回复「导航」获取精选文章
与非学堂
专注青少年信息技术教育,探讨少儿编程的教与学,交流技巧、分享资源。
公众号
一、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」更多精彩
喜欢就请「分享」「点赞」「在看」吧!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。