Friday, September 18, 2009

python笔记一:元组(list)和切片(slice)的强大威力

前言:

list的运算符加上切片操作几乎可以完成任何你想要的对于list的操作,本文尝试用list的运算符加切片操作完成list的方法的替换,使得语法上对list的操作可以极为简介,效率上不一定是最优的,但是在针对效率是可以参照api手册专门优化。

list的简介

相当于c语言的数组,其构造函数list()可以将输入的对象转化为list类型,如list("hello")的结果就是['h', 'e', 'l', 'l', 'o',],这一点非常有用,因为string属于不可变对象,当想要对string进行一些操作时,可以用这个方法转换。

内建函数enumerate(),用于list时,可以将list的坐标和对应值返回,形成一个新的list,在需要用到坐标信息时很方便。

list运算符介绍

+将两个list连接起来
*n将list重复n次连接起来

切片(slice)简介

相当于python对可迭代对象的坐标系统,slice的格式如下所示L[x:y:z],其中x是起始坐标,y是结束坐标,z是步进值,z可以是非零的任意整数,很经典的应用就是z=-1,实现L的逆序操作。x,y,z是可以省略的,默认值分别是0,None,1。可以见后面的详细解释。

对于list的切片可以按下面的方式来理解,还是以L="hello"为例:

0'h'1'e'2'l'3'l'4'o'None

0,1,2,3,4,None是切片的坐标,list的元素排在对应坐标的后面。最后一个元素前的坐标也就是4可以写成-1,以-1为坐标,步进-1值得到的坐标是-2,等效于0而不是None,None代表无元素的坐标,很特殊,不参与步进计算。

切片操作分为有:和无:的版本:

无:的切片就是取出制定坐标后面的相应元素,如L[0]= 'h',L[4]='o'。

有:的版本,x和y定义了切片操作的边界,z定义了切片操作的步进值。几个典型的例子:

L[0:3],从上面的坐标系统可以得到取值是'hel'
L[0:]或L[:],等效于L[0:None],取值是'hello'
L[:-1],等效于L[0:-1],取值是'hell'
L[-1:],等效于L[-1:None],取值是'o'
L[0:0],L[3:3],中间没有元素,取值是空list[],但是这个相当于指定当前坐标,在插入运算时很有用。取L[3:3]=L1时,3,3之间插入L1的元素,然后更新坐标系统,其实不难理解。

有了上面的基础知识,就可以回到文章的主题了,将list的函数都用list运算符加切片操作

del L(i) >>> L(i:i+1)=[]
list.append(x) >>> L1+[x],但是运算符+的效率不如append函数。
list.insert(i, x) >>> L1[i:i]=[x]
list.extend(list) >>> L1+L2,但是运算符+的效率不如extend函数。
list.pop(x) >>> z=L[-1], L[-1:]=[]
list.remove(x) >>> for i, z in enumerate(L1): if z=x:L1[i:i+1]=[];return z;
list.inde(x) >>> for i, z in enumerate(L1): if z=x: return i;
list.count(x) >>> n=0; for z in L1: if z=x: n=n+1; return n;
list.sort(x) >>> 算法比较麻烦
list.reverse() >>> L[::-1]

No comments: