1、切片
有一个list—>L = [1,2,3,4,5,6,7]或tuple—>T = (1,2,3,4,5,6,7),如果想取得前三个元素,怎么操作?
硬方法,也是低效的方法是:L= L[L[0], L[1], L[2]]。但是如果数量多,就算是用循环也很麻烦。但是Python提供了,Slice切片操作符。如下:
>>> L[0:3]
[1,2,3]
L[0:3]
表示,从索引0
开始取,直到索引3
为止,但不包括索引3
。即索引0
,1
,2
,正好是3个元素。如果第一个索引是0
,还可以省略,直接L[:3]。也可以从第三开始,取三个元素:L[2:5]。Python支持L[-1]取倒数第一个元素,同样支持切片。即是,Python支持由0开始从左到右,也可以从-1开始从右往左,做切片操作。
通常一个切片操作要提供三个参数 [start_index: stop_index: step] 。其中,start_index是切片的起始位置;stop_index是切片的结束位置(但是不包括该索引的元素);step可以不提供,默认值是1,步长值不能为0,不然会报错ValueError。
当 step 是正数时,以list[start_index]元素位置开始(包括该位置元素), step作为步长到list[stop_index]元素位置(不包括该位置元素)为止,从左向右截取。这里面一个重点就是,要保证 list[stop_index]元素的逻辑位置必须在list[start_index]元素的逻辑位置右边,否则取不出元素。下面是一些合法的例子:
>>> L[1:5] [2, 3, 4, 5] >>> L[1:-1] #-1代表的是元素7的位置 [2, 3, 4, 5, 6] >>> L[-5:-1] [3, 4, 5, 6]
>>> L[1:-2]
[2, 3, 4, 5]
下面是一些非法的例子:
>>> L[-1:-3] [] >>> [-3:1] File "<console>", line 1 [-3:1] ^ SyntaxError: invalid syntax
下面是一些容易弄混的例子:
>>> L[-6:-1:1] #start_index是-6,即数2,而stop_index是-1 [2, 3, 4, 5, 6] >>> L[-1:-6:-1] #start_index是-1,即数7,而stop_index是-6 [7, 6, 5, 4, 3] >>> L[-1:-6:1] #不合法,不符合逻辑从左到右 [] >>> L[-6:-1:2] [2, 4, 6] >>> L[-1:-6:-2] [7, 5, 3]
start_index和stop_index都是可以省略的,比如L[:]。被省略的默认由其对应左右边界起始元素开始截取:
>>> L[:]
[1, 2, 3, 4, 5, 6, 7]
>>> L[:3]
[1, 2, 3]
>>> L[:-1]
[1, 2, 3, 4, 5, 6]
>>> L[-5:] #取最后五个数
[3,4,5,6,7]
>>> L[-5::2] #去最后五个数中的奇数
[3, 5, 7]
一些常用的切片操作,参考(https://blog.csdn.net/xpresslink/article/details/77727507):
# 取前一部分 >>> alist[:5] [0, 1, 2, 3, 4] # 取后一部分 >>> alist[-5:] [5, 6, 7, 8, 9] # 取偶数位置元素 >>> alist[::2] [0, 2, 4, 6, 8] # 取奇数位置元素 >>> alist[1::2] [1, 3, 5, 7, 9] # 浅复制,等价于list.copy()更加面向对象的写法 >>> blist = alist[:] >>> blist [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 返回一个逆序列表,推荐reversed(list)的写法,更直观易懂。 >>> alist[::-1] [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] # 在某个位置插入多个元素 >>> alist[3:3] = ['a','b','c'] >>> alist [0, 1, 2, 'a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9] # 在开始位置之前插入多个元素 >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> alist[:0] = ['a','b','c'] >>> alist ['a', 'b', 'c', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 替换多个元素 >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> alist[0:3] = ['a','b','c'] >>> alist ['a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9] # 删除切片 >>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> del alist[3:6] >>> alist [0, 1, 2, 6, 7, 8, 9]
切片练习题,https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431756919644a792ee4ead724ef7afab3f7f771b04f5000#0
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Date : 2018-05-22 19:13:58 4 # @Author : Chen Jing (cjvaely@foxmail.com) 5 # @Link : https://github.com/Cjvaely 6 # @Version : $Id$ 7 8 # 切片Slice练习 9 # 利用切片操作,实现一个trim()函数, 10 # 去除字符串首尾的空格,注意不要调用str的strip()方法 11 12 def trim(s): 13 if s[:1] == ' ': 14 return trim(s[1:]) 15 elif s[-1:] == ' ': 16 return trim(s[:-1]) 17 else: 18 return s 19 20 21 # 测试: 22 if trim('hello ') != 'hello': 23 print('测试失败!') 24 elif trim(' hello') != 'hello': 25 print('测试失败!') 26 elif trim(' hello ') != 'hello': 27 print('测试失败!') 28 elif trim(' hello world ') != 'hello world': 29 print('测试失败!') 30 elif trim('') != '': 31 print('测试失败!') 32 elif trim(' ') != '': 33 print('测试失败!') 34 else: 35 print('测试成功!')