python中的 str、tuple、list能用[start:end:step]的形式快速取得所需要的值。
[start,end) 左开右闭 ,例如,[1,2]实际只取第二个元素
需要注意的是,列表切片产生的是列表的副本,与原列表不是同一份空间。
start默认为0,end不填则取值至最后
list=range(100)
list[2:10] #结果[2, 3, 4, 5, 6, 7, 8, 9]
(0,1,2,3,4,5)[:3] #结果(0, 1, 2)
'abcdefg'[4:6] # 结果'ef'
step表示取值间隔
[0,1,2,3,4,5,6,7,8,9][:10:2] #隔两个数取一个元素[0, 2, 4, 6, 8]
start,end的为负数时,-1指倒数第一个元素,-2为倒数第二个
list=range(100)
list[-10:] #倒数第十个至最后 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
list[:-80] # 开始至倒数-80个 [0,1,...,19]
step为负值时从右往左取值,start表示的位置应该在end的右边
此时start默认为-1,end默认为0
[0,1,2,3,4,5,6,7,8,9][:-10:-2] #step为负,从右往左取元素[9, 7, 5, 3, 1] start为-1,
[0,1,2,3,4,5,6,7,8,9][5:9:-2] #[] start为在end的左边,返回空的list
[0,1,2,3,4,5,6,7,8,9][9:5:-1] # [9, 8, 7, 6]
[0,1,2,3,4,5,6,7,8,9][5::-1] # [5, 4, 3, 2, 1, 0]
经典运用,翻转字符串
'abcdef'[::-1] #倒转 'fedcba'
扩展:赋值,删除
list的切片,内部是调用getitem,setitem,delitem和slice函数。而slice函数又是和range()函数相关的。
给切片传递的键是一个特殊的slice对象。该对象拥有可描述所请求切片方位的属性,例如:
>>> list2=[0,1,2,3,4,5,6,7,8,9]
>>> list2[1:3]=['a','a']
>>> list2
[0, 'a', 'a', 3, 4, 5, 6, 7, 8, 9]
>>> list2[1:0]=['b','b'] #这里的end的值小于start时表示在插入,不覆盖
>>> list2 #在第二个元素(下标1)前插入
[0, 'b', 'b', 'a', 'a', 3, 4, 5, 6, 7, 8, 9]
>>> del list2[3:5]
>>> list2
[0, 'a', 'a', 5, 6, 7, 8, 9]
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 ) )