列表是Python中经常使用到的内置类型之一,今天说一说Python列表的使用(示例运行环境win7+python2.7.6)
列表的创建
列表的创建有三种方法,list(),list(iterable),[],其中前两种不是很常用,下面分别介绍
list()
创建一个空列表,如下:
>>> list() [] >>> >>> [] [] >>>
list(iterable)
list(iterable),传入一个可迭代对象,返回一个列表,其中的iterable可以是字符串、列表、元组等,如下:
>>> list('abcdefg') ['a', 'b', 'c', 'd', 'e', 'f', 'g'] >>> list([1,2,3,4]) [1, 2, 3, 4] >>> list((1,2,3,4)) [1, 2, 3, 4] >>>
空列表
var = [],将创建一个空的列表保存在变量var中,也可以有下面的写法,创建非空的列表:
>>> var = [1,2,3] >>> var [1, 2, 3] >>>
列表的访问
列表常用的访问操作有索引、切片、搜索
索引
列表的索引分两种,正索引和负索引。正索引从0开始,最大下标为len(list)-1,如果索引的下标大于len(list)-1将抛出IndexError异常,如下:
>>> var = [1,2,3] >>> var [1, 2, 3] >>> var[0] 1 >>> var[2] 3 >>> var[3] Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> var[3] IndexError: list index out of range >>>
负索引从列表尾开始,-1表示最后一个元素,-2表示倒数第二个元素,依次类推,-n表示第len(list)-n个元素,如下:
>>> var [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> var[-1] 9 >>> var[-5] == var[len(var)-5] True >>> var[-5] 5 >>>
切片操作
切片操作包含三个参数,list[start:end:step],start指切片的开始下标,end指切片的结束下标(切片出来的列表不包含结束下标对应的值),step指切片的步长(默认为1,通常不指定),如下:
>>> var [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> var[0:9:2]# 带三个参数,从0开始,到9结束,隔一个取一个 [1, 3, 5, 7, 9] >>>
还有很多种简写的格式,如下:
var[:5],省略开始下标和步长,相当于var[0:5:1],如下:
>>> var [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> var[:5] [1, 2, 3, 4, 5] >>> >>> var[0:5:1] [1, 2, 3, 4, 5] >>>
var[2:],省略结束下标和步长,相当于var[2:len(var):1],如下:
>>> var [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> var[2:] [3, 4, 5, 6, 7, 8, 9] >>> var[2:len(var):1] [3, 4, 5, 6, 7, 8, 9] >>>
- var[:],切片整个列表,将返回一个与var包含相同元素的列表(拷贝),相当于var[0:len(var):1],如下:
>>> var [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a = var[:] >>> b = var[0:len(var):1] >>> id(var)# id不同 30342440 >>> id(a)# id不同 29977896 >>> id(b)# id不同 30332648 >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> b [1, 2, 3, 4, 5, 6, 7, 8, 9] >>>
搜索
列表的搜索包括查询某元素第一次出现的下标,判断某元素是否在列表中
-
index(value[,start,end]),
在start与end(不包括end)之间查找value第一次出现的位置,找到返回下标,未找到抛出ValueError异常。默认start为0,end为len(list),即在整个列表中查找。如下:
>>> var [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> var.index(4,0,len(var)) 3 >>> var.index(4) 3 >>> var.index(4,0,3) Traceback (most recent call last): File "<pyshell#51>", line 1, in <module> var.index(4,0,3) ValueError: 4 is not in list >>>
-
in
判断某个元素是否在列表中,在返回True,不在返回False,如下:
>>> var [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> 0 in var False >>> 6 in var True >>>
-
count
判断某个元素是在列表中出现的次数,如下:
>>> var [0, 1, 2, 0, 23, 2, 3, 4, 5, 6, 1, 7, 8, 9, 8, 6] >>> var.count(0) 2 >>> var.count(10) 0 >>>
-
列表的编辑
列表的编辑包括增加元素到列表,从列表中删除元素,修改列表中的元素等
增加元素到列表
列表增加元素有append,insert,+,+=,*,*=,extend,下面一一介绍:
-
append(object)方法
在列表尾部增加一个元素,如下:
>>> var [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> var.append(10) >>> var [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>>
-
insert(index, object)方法
在指定位置插入元素,如下:
>>> var [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> var.insert(0,0) >>> var [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>>
-
+运算符,返回一个新的列表,不改变原列表
>>> var [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> a = var + [11,12] >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] >>> var [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>>
-
+=运算符,改变原列表
>>> var [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> var += [11,12] >>> var [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] >>>
-
extend(iterable)方法
extend方法将可迭代对象的全部元素逐个添加到列表的尾部,将改变原列表,如下:
>>> var [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] >>> var.extend([13,14]) >>> var [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] >>> >>> var.extend('ABC') >>> var [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 'A', 'B', 'C'] >>> var.extend(('D','E','F')) >>> var [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 'A', 'B', 'C', 'D', 'E', 'F'] >>>
-
*运算符
返回新列表,不改变原列表,如下:
>>> var [1, 2] >>> var * 2 [1, 2, 1, 2] >>> var [1, 2]
-
*=运算符
改变原列表,如下:
var *= 2 >>> var [1, 2, 1, 2]
-
从列表中删除元素
从列表中删除元素有三种方法,remove,pop,del
- remove(value)
从列表头开始查找,删除第一个等于value的元素,如果直到列表尾都没有找到与value相等的元素将抛出ValueError异常,如下:
>>> var [1, 2, 1, 2] >>> var.remove(1) >>> var [2, 1, 2] >>> var.remove(3) Traceback (most recent call last): File "<pyshell#95>", line 1, in <module> var.remove(3) ValueError: list.remove(x): x not in list >>>
-
pop([index])
弹出指定下标的元素,默认为最后一个元素,如果给定的下标不在列表下标范围内将抛出IndexError异常,如下:
>>> var [2, 1, 2] >>> var.pop() 2 >>> var [2, 1] >>> var.pop(0) 2 >>> var [1] >>> >>> var.pop(1) Traceback (most recent call last): File "<pyshell#101>", line 1, in <module> var.pop(1) IndexError: pop index out of range >>>
-
del
>>> var [1, 2, 3, 4] >>> del var[3] >>> var [1, 2, 3] >>>
- remove(value)
列表的排序
列表的排序可以使用自己的sort方法或者内置方法sorted来实现,内置sorted(iterable,cmp=None,key=None,reverse=False),将返回排序后的列表。列表方法sort(cmp=None,key=None,reverse=False)将改变原列表。两个方法相应的参数含义一样,cmp表示比较的函数(接收两个参数,返回比较结果,>,==,<),将决定谁大谁小;key为要比较的对象,即比较元素的什么字段,下例的x坐标或y坐标。如下:
>>> var [(0, 0), (1, 5), (2, 1), (0, 1), (7, 8), (8, 8)] >>> var.sort(key=lambda x:x[0])# 假设上述数据均为坐标,则该条语句是按x坐标升序排列 >>> var [(0, 0), (0, 1), (1, 5), (2, 1), (7, 8), (8, 8)] >>> var.sort(key=lambda x:x[1],reverse=True)# 按y坐标降序排列 >>> var [(7, 8), (8, 8), (1, 5), (0, 1), (2, 1), (0, 0)] >>> 备注:lambda定义一个简单方法,可以赋值给一个变量保存该方法,冒号前为需要传入的参数,冒号后为返回值的表达式,如下: >>> add = lambda x,y:x+y >>> add <function <lambda> at 0x01D6A9B0> >>> add(1,2) 3 >>> add(11,22) 33 >>>
与元组的比较
列表与元组有着太多的相似之处,可以说元组是不可编辑的列表。下面我们来看看两者的区别:
元组
列表
创建
tuple() -> empty tuple
list() -> new empty list
()
[]
tuple(iterable) -> tuple initialized from iterable's items
list(iterable) -> new list initialized from iterable's items
(iterable)
[iterable]
访问
相同
编辑
append,不支持
insert,不支持
extend,不支持
+,创建新实例重新赋值
+=,创建新实例重新赋值
*,创建新实例重新赋值
*=,创建新实例重新赋值
append,追加到列表尾
insert,插入元素到指定下标
extend,将一个列表的元素逐个添加到列表尾
+,创建新实例重新赋值
+=,在列表尾添加全部的元素
*,创建新实例重新赋值
*=,执行n次对自身的extend
排序
sorted,支持,返回排序后的元组
self.sort,不支持
sorted,支持,返回排序后的列表
self.sort,支持,对自身进行排序,不返回列表,将修改自身