python分片

2247阅读 0评论2011-09-18 大方无隅
分类:Python/Ruby

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

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

在这个例子中,分片包含了另外一个数字。没错,这就是步长的显式设置。如果步长被设置为比1大的数,那么就会跳过某些元素。例如,步长为2的分片包括的是从开始到结束每隔1个的元素。
>>> numbers[0:10:2]  
[1, 3, 5, 7, 9]  
numbers[3:6:3]  
[4]

之前提及的捷径也可以使用。如果需要将每4个元素中的第1个提取出来,那么只要将步长设置为4即可:
>>> numbers[::4]  
[1, 5, 9]

当然,步长不能为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]  
>>> numbers[:5:-2]  
[10, 8]

在这里要得到正确的分片结果需要动些脑筋。开始点的元素(最左边元素)包括在结果之中,而结束点的元素(最右边的元素)则不在分片之内。当使用一个负数作为步长时,必须让开始点(开始索引)大于结束点。在没有明确指定开始点和结束点的时候,正负数的使用可能会带来一些混淆。不过在这种情况下Python会进行正确的操作:对于一个正数步长,Python会从序列的头部开始向右提取元素,直到最后一个元素;而对于负数步长,则是从序列的尾部开始向左提取元素,直到第一个元素。

上一篇:extend (扩展) 与 append (追加) 的差别
下一篇:Python - extend vs append on a list