python切片详解
先从原理上分析切片运算:
list的切片,内部是调用__getitem__,__setitem__,__delitem__和slice函数。而slice函数又是和range()函数相关的。
给切片传递的键是一个特殊的slice对象。该对象拥有可描述所请求切片方位的属性,例如:
1
2
3
4
|
a = [ 1 , 2 , 3 , 4 , 5 , 6 ] x = a [ 1 : 5 ] # x = a.__getitem__( slice ( 1 , 5 , None ) ) a [ 1 : 3 ] = [ 10 , 11 , 12 ]# a.__setitem__( slice ( 1 , 3 , None ), [ 10 , 11 , 12 ] ) del a [ 1 : 4 ]# a.__delitem__( slice ( 1 , 4 , None ) ) |
Python 的切片功能实际上比很多程序员认为的更强大。
1
|
a = m [ 0 : 100 : 10 ] # 带步进的切片(步进值=10) |
注意:步进值为step
当step > 0 时
切片从 start(含start)处开始,到end(不含end)处结束,**从左往右**,每隔(step-1)(索引之间的差仍为step,但相隔的元素是step-1个)个元素进行一次截取。
这时,start 指向的位置应该在end指向的位置的左边,否则返回值为空
当step < 0 时
切片从 start(含start)处开始,到end(不含end)处结束,**从右往左**,每隔(step-1)(索引之间的差仍为step,但相隔的元素是step-1个)个元素进行一次截取。
这时,start 指向的位置应该在end指向的位置的右边,否则返回值为空
有一个经典应用是:翻转字符串
比如:
1
2
|
>>> str = 'pythontab.com' >>> str [:: - 1 ] |
结果为:
'moc.batnohtyp'
切片边界问题
实例:
1
2
3
4
5
6
|
s = [ 1 , 2 , 3 , 4 ] # S 上界为 0 下界为 4 s[ - 100 : 100 ] #返回 [1,2,3,4] -100超出了上界,100超出了下界:等价于 s[0:4] s[ - 100 : - 200 ] #返回 [] -100,-200均超出了上界,自动取上界:等价于s[0:0] s[ 100 : 200 ] #返回 [] 100,200均超出了下界,自动取下界值:等价于s[4:4] s[: 100 ] #返回 [1,2,3,4] 开始值省略表示从第0个开始 s[ 0 :] #返回 [1,2,3,4] 结束值为空表示到最后一个结束 |
注意:我使用的python版本为python2.7,python的切片存在版本兼容问题。在python3中有更加高级的功能和用法,在使用时一定要注意自己的python版本。