先从原理上分析切片运算:
list的切片,内部是调用__getitem__,__setitem__,__delitem__和slice函数。而slice函数又是和range()函数相关的。
给切片传递的键是一个特殊的slice对象。该对象拥有可描述所请求切片方位的属性,例如:
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 的切片功能实际上比很多程序员认为的更强大。例如,它支持以下扩展切片的变体,在处理像矩阵和数组这样的多维数据结构的时候可能非常有用:
a = m [ 0 : 100 : 10 ] # 带步进的切片(步进值=10)
b = m [ 1 : 10, 3 : 20 ] # 多维切片
c = m [ 0 : 100 : 10, 50 : 75 : 5 ] # 带步进值的多维切片
m [ 0 : 5, 5 : 10 ] = n # 扩展切片分配
del m [ : 10, 15 : ] # 扩展切片删除
扩展切片每个维度的一般格式是 i : j [ : stride ], stride 时可选的。和普通切片一样,可以省略切片每个部分的开始或者结束值。另外,省略号(...)可用于表示宽展切片中结束或者开始的任意维数:
a = m [ ..., 10 : 20 ] # 使用 Ellipsis 对象访问扩展切片
m rfg[ 10 : 20, ... ] = n
使用扩展切片时,__getitem__(), __setitem__()和__delitem__()方法分别用于实现访问、修改和删除操作。然而,传递给这些方法的值是一个包含slice或Ellipsis对象组合的元组,而非整数,例如:
a = m [ 0 : 10, 0 : 100 : 5, ... ]
调用__getitem__()方法的方式如下:
a = m.__getitem____( ( slice ( 0, 10, None ), slice ( 0, 100, 5 ), Ellipsis ) )
下面具体介绍用法:
切片( [ ] 和 [ : ] )
正向索引
反向索引
默认索引
接下来以字符串'abcd'为例子.表里面分别列出了使用正索引和负索引来定位字符的情况.
可以用长度操作符来确认该字符串的长度是 4:
>>> aString = 'abcd'
>>> len(aString)
4
Edit By Vheavens
Edit By Vheavens
正向索引时,
索引值开始于 0,结束于总长度减 1(因为我们是从 0 开始索引的).本例中最后
一个索引是:
final_index = len(aString) - 1
= 4 - 1
= 3
在这个范围内,我们可以访问任意的子串。用一个参数来调用切片操作符结果是一个单一
字符,而使用一个数值范围(用':')作为参数调用切片操作的参数会返回一串连续地字符.再强
调一遍,
对任何范围[start:end],我们可以访问到包括 start 在内到 end(不包括 end)的所有字
符,换句话说,假设 x 是[start:end]中的一个索引值,那么有: start<= x < end.
>>> aString[0]
'a'
>>> aString[1:3]
'bc'
>>> aString[2:4]
'cd'
>>> aString[4]
Traceback (innermost last): File "", line 1, in ?
IndexError: string index out of range
使用不在允许范围(本例中是 0 到 3)内的索引值会导致错误。上面的 aString[2:4]却并没
有出错,那是因为实际上它返回的是索引值 2 和 3 的值。但是直接拿 4 作为索引访问是不被允
许的。
在进行反向索引操作时,是从-1 开始,向字符串的开始方向计数,到字符串长度的负数为
索引的结束。最末一个索引(也就是第一个字符)是这样定位的:
final_index
= -4
= -len(aString)
>>> aString[-1]
'd'
>>> aString[-3:-1]
'bc'
>>> aString[-4]
'a'
Edit By Vheavens
Edit By Vheavens
如果开始索引或者结束索引没有被指定,则分别以字符串的第一个和最后一个索引值为
默认值。
>>> aString[2:]
'cd'
>>> aString[1:]
'bcd'
>>> aString[:-1]
'abc'
>>> aString[:]
'abcd'
注意:起始/结束索引都没有指定的话会返回整个字符串.
前几天在书上看到个公式很好用:s[n]=s[n-len (s)] (n为正数) 或者 s[n]=s[len(s)+n] (n为负数)
1 s=[1,2,3,4] # S 上界为 0 下界为 4
2 print s[-100:100] #返回 [1,2,3,4] -100超出了上界,100超出了下界:等价于 s[0:4]
3 print s[-100:-200] #返回 [] -100,-200均超出了上界,自动取上界:等价于s[0:0]
4 print s[100:200] #返回 [] 100,200均超出了下界,自动取下界值:等价于s[4:4]
s[i] = x操作将列表索引为 i 的元素重新赋值为对象 x ,并增加 x 的引用记数。如果i是负数,在求值之前,就先执行 i+=len(s),计算结果必须是一个小于len(s)的非负整数。尝试给一个不存在的索引赋值会引发 IndexError 异常. 切片分配操作符 s[i:j] = r 将列表片段s[i:j]替换为序列 r。如:
1 a = [1,2,3,4,5]
2 a[1] = 6 # a = [1,6,3,4,5]
3 a[2:4] = [10,11] # a = [1,6,10,11,5]
4 a[3:4] = [-1,-2,-3] # a = [1,6,10,-1,-2,-3,5]
5 a[2:] = [0] # a = [1,6,0]
del s[i]语句从列表s中删除元素i,并将它的引用记数减1。del s[i:j]语句删除一个切片。
阅读(6578) | 评论(7) | 转发(2) |