1

2.3Python下分片

Posted by 撒得一地 on 2015年12月30日 in python教程

与使用索引来访问单个元素类型,可以使用分片操作来访问一定范围内的元素。分片通过冒号相隔的两个索引来实现:

>>> url='<a href="http://coderschool.cn">技术拉近你我</a>'
>>> url[9:30]
'http://coderschool.cn'
>>> url[32:-4]
'技术拉近你我'

分片操作对于提取序列的一部分是很有用的。而编号在这里显得尤为重要。第一个索引是需要提取部分的第一个元素的编号,而最后的索引是分片之后剩下部分的第一个元素的编号。如:

>>> numbers=[1,2,3,4,5,6,7,8,9,10]
>>> numbers[3:6]
[4, 5, 6]
>>> numbers[0:1]
[1]

简而言之,分片操作的实现需要提供两个索引作为边界,第一个索引的元素是包含在分片内的,而第二个则不包含在分片内。

1.序列简易操作

假设需要访问最后3个元素(上面numbers的例子),那么可以进行如下操作:

>>> numbers[7:10]
[8, 9, 10]

从上面的输出结果可以知道,索引10指向的是第11个元素,这个元素并不存在,索引在最后一个元素之后。不过,这样访问却是合法的。那么,如果需要从序列结尾开始计数该怎么做?

>>> numbers[-3:-1]
[8, 9]

根据上面的例子可以知道,看来不能使用索引-1来代表最后一个元素。那么使用索引0作为第二部操作所使用的索引是否可行,看下输出结果:

>>> numbers[-3:0]
[]

直接输出一个空序列。实际上,只要分片中最左边的索引比它右边的晚出现在序列中,结果就是一个空序列。然而,在Python中可以使用一个简易操作,如果分片所得部分包括序列结尾的元素,那么,只需将最后一个索引置空即可:

>>> numbers[-3:]
[8, 9, 10]

这种方法同样适用于开始的元素:

>>> numbers[:3]
[1, 2, 3]

实际上,如果需要复制整个序列,可以将两个索引都置空:

>>> numbers[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

实例:对http://www.example.com形式的url进行分割

>>> url=input('Please enter a URL:')
Please enter a URL:http://www.baidu.com
>>> domain=url[11:-4]
>>> print("Domain name:"+domain)
Domain name:baidu

2.更大的步长

进行分片的时候,分片的开始和结束点需要进行指定(不管是直接还是间接)。而另外一个参数(Python2.3加入到内建类型)——步长(step length)——通常都是隐式设置的。在普通的分片中,步长是1——分片操作就是按照这个步长逐个遍历序列的元素,然后返回开始和结束点之间的所有元素。

>>> numbers[0:10:1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

在上面的例子中,分片除了开始索引和结束索引,还包含了另外一个数字。这个数字的作用就是用来设置步长的。如果步长被设置的比1大,那么就会跳过某些元素。例如步长为2的例子(从开始到结束每隔一个元素):

>>> numbers[0:10:2]
[1, 3, 5, 7, 9]
>>> numbers[3:6:3]
[4]

要注意,步长不能为0。步长为0那么就不会向下执行。不过步长可以是负数,即从右到左提取元素:

>>> numbers[8:3:-1]
[9, 8, 7, 6, 5]
>>> numbers[10:0:-2]
[10, 8, 6, 4, 2]
>>> numbers[0:10:-2]
[]
>>> numbers[::-2]
[10, 8, 6, 4, 2]
>>> numbers[5::-2]
[6, 4, 2]

分片时,开始点的元素(最左边元素)包括在结果之中,而结束点的元素(最右边的元素)则不在分片之内。当使用一个负数作为步长时,必须让开始点(开始索引)大于结束点。对于一个正数步长,Python会从序列的头部开始向右提取元素,直到最后一个元素;而对于负数步长,则是从序列的尾部开始向左提取元素,直到第一个元素。

标签:

上一篇:

下一篇:

相关推荐

1 Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注

8 + 6 = ?

网站地图|XML地图

Copyright © 2015-2018 技术拉近你我! All rights reserved.
闽ICP备15015576号-1,版权所有©psz.