取一个list或者tuple的部分元素是非常非常常见的操作。
比如有一个list如下
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
那么,取前三个元素如何取?
我反正第一时间想到用下标,用索引
L1 = [L[0], L[1], L[2]]
上面是笨方法
那扩展一下使用for循环
r = []
n = 3
for i in range(n):
r.append(L[i])
print(r)
可以写一个函数将其封装起来,并且可以做到通用,但是,如果经常取指定索引范围的操作,适用循环就会变得非常麻烦。所以Python提供了切片(Slice)操作符,能大大简化这种操作。
对于上述问题,取前3个元素,用一行代码就可以完成切片:
>>> L[0:3]
['Michael', 'Sarah', 'Tracy']
L[0:3]表示,从索引的0开始取,到3为止,不包括3
理解为L[x:y],如果x,y都大于等于0,表示从x开始取,取y个元素。
如果第一个索引是0,还可以省略:
>>>L[:3]
['Michael', 'Sarah', 'Tracy']
Python支持L[-1]取倒是第一个元素,所以,同样支持倒数切片,
>>>L[-2:]
>['Bob', 'Jack']
>>>> L[-2:-1]
['Bob']
这里表示,方向仍然是正方向的,其中L[-2:],省略了第二个数,也就表示从倒数第二个开始取,取完的意思。
以及,倒数第一个元素的索引是==-1==
切片操作实操
先创建一个0-99的数列
L=list(range(100))
print(L)
[0, 1, 2, 3, ..., 99]
取前10个数:
>>>L[:10]
>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
后10个数:
>>>L[-10:]
>[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
取11-20个数
>>>L[10:20]
>[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
前十个数,每两个取一个:
>>>L[:10:2]
>[0, 2, 4, 6, 8]
取所有数,每5个取一个:
>>>L[::5]
>[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
啥都不写,只写[:]就可以复制一个list
>>>L[:]
>[0, 1, 2, 3, ..., 99]
那tuple也一样,只是注意,tuple切片的结果仍然是tuple
字符串也可以切片,和list和tuple一样。
练习
利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
def trim(s):
while s[:1] == ' ':
s = s[1:]
while s[-1:] == ' ':
s = s[:-1]
return s
一开始想到的是,设置一个begin和end索引,然后一个个循环找出开头不是空格的索引的位置,和结尾不是空格的索引位置,然后切片,发现代码又臭又长。这边直接使用索引,取出首部第一个和结尾第一个进行比较,若是空格,则再用切片首部从第一个开始切(有第0个之说),结尾来看,若是空格,则切去最后一个,利用切片来写就是s[:-1],牢记,切片都是正向。
小结
有了切片操作,很多地方循环就不再需要了。Python的切片非常灵活,一行代码就可以实现很多行循环才能完成的操作。