2.3Python下分片
下一篇: 2.4Python序列相加和相乘
与使用索引来访问单个元素类型,可以使用分片操作来访问一定范围内的元素。分片通过冒号相隔的两个索引来实现:
>>> 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会从序列的头部开始向右提取元素,直到最后一个元素;而对于负数步长,则是从序列的尾部开始向左提取元素,直到第一个元素。
下一篇: 2.4Python序列相加和相乘
1 Comment
过来看看、感谢分享