Python列表类型
来自CloudWiki
目录
列表的定义
列表是包含0个或多个元组组成的有序序列,属 于序列类型。列表可以元素进行增加、删除、替 换、查找等操作。列表没有长度限制,元素类型 可以不同,不需要预定义长度。
列表类型用中括号([])表示,也可以通过list(x) 函数将集合或字符串类型转换成列表类型
基础操作
创建列表
- 使用“=”直接将一个列表赋值给变量即可创建列表对象。
>>> a_list = ['a', 'b', 'mpilgrim', 'z', 'example'] >>> a_list = [] #创建空列表
- 也可以使用list()函数把元组、range对象、字符串、字典、集合或其他可迭代对象转换为列表。
>>> list((3,5,7,9,11)) #将元组转换为列表 [3, 5, 7, 9, 11] >>> list(range(1, 10, 2)) #将range对象转换为列表 [1, 3, 5, 7, 9] >>> list('hello world') #将字符串转换为列表 ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'] >>> list({3,7,5}) #将集合转换为列表 [3, 5, 7]</nowiki>
- 两个列表相加:
>>> ls =[1,2,3] >>> lt =[4,5,6] >>> ls = ls + lt >>> print(ls) [1, 2, 3, 4, 5, 6]
列表的索引
- 创建列表之后,可以使用整数作为下标来访问其中的元素,其中0表示第1个元素,1表示第2个元素,2表示第3个元素,以此类推;列表还支持使用负整数作为下标,其中-1表示最后1个元素,-2表示倒数第2个元素,-3表示倒数第3个元素,以此类推。
>>> x = list('Python') #创建类别对象 >>> x ['P', 'y', 't', 'h', 'o', 'n'] >>> x[0] #下标为0的元素,第一个元素 'P' >>> x[-1] #下标为-1的元素,最后一个元素 'n'
- 可以使用遍历循环对列表类型进行遍历操作
>>> x = list('Python') >>> for i in x: print(i) P y t h o n
列表的切片
切片是列表的基本操作,用于获得列表的一个片 段,即获得一个或多个元素。
切片后的结果也是 列表类型。
切片有两种使用方式:
- <列表或列表变量>[N: M] :获取从N到M(不包含M)的元素组成新 的列表。
- <列表或列表变量>[N: M: K] :获取从N到M(不包 含M)以K为步长所对应元素组成的列
>>> ls = [1010,"1010",[1010,"1010"],1010] >>> ls[1:4] ['1010', [1010, '1010'], 1010] >>> ls[-1:-3] [] >>> ls[-3:-1] ['1010', [1010, '1010']] >>> ls[0:4:2] [1010, [1010, '1010']]
列表对象支持的运算符
加法运算符
- 加法运算符+也可以实现列表增加元素的目的,但不属于原地操作,而是返回新列表,涉及大量元素的复制,效率非常低。使用复合赋值运算符+=实现列表追加元素时属于原地操作,与append()方法一样高效。
>>> x = [1, 2, 3] >>> id(x) 53868168 >>> x = x + [4] #连接两个列表 >>> x [1, 2, 3, 4] >>> id(x) #内存地址发生改变 53875720 >>> x += [5] #为列表追加元素 >>> x [1, 2, 3, 4, 5] >>> id(x) #内存地址不变 53875720
乘法运算符
- 乘法运算符*可以用于列表和整数相乘,表示序列重复,返回新列表。运算符*=也可以用于列表元素重复,属于原地操作。
>>> x = [1, 2, 3, 4] >>> id(x) 54497224 >>> x = x * 2 #元素重复,返回新列表 >>> x [1, 2, 3, 4, 1, 2, 3, 4] >>> id(x) #地址发生改变 54603912 >>> x *= 2 #元素重复,原地进行 >>> x [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4] >>> id(x) #地址不变
成员测试运算符in
- 可用于测试列表中是否包含某个元素,查询时间随着列表长度的增加而线性增加,而同样的操作对于集合而言则是常数级的。
>>> 3 in [1, 2, 3] True >>> 3 in [1, 2, '3'] False
列表的操作函数
- len(ls) 列表ls的元素个数(长度)
- min(ls) 列表ls中的最小元素
- max(ls) 列表ls中的最大元素
- list(x) 将x转变成列表类型
>>> ls = [1010,"1010",[1010,"1010"],1010] >>> len(ls) 4 >>> ls = [1010, 10.10, 0x1010] >>> min(ls) 10.1 >>> lt = ["1010", "10.10", "Python"] >>> max(lt) 'Python' >>> ls = ls + lt >>> print(ls) [1010, 10.1, 4112, '1010', '10.10', 'Python'] >>> min(ls) Traceback (most recent call last): File "<pyshell#46>", line 1, in <module> min(ls) TypeError: '<' not supported between instances of 'str' and 'float'
列表的操作方法
列表的常用方法
append()、insert()、extend()
- append()用于向列表尾部追加一个元素,insert()用于向列表任意指定位置插入一个元素,extend()用于将另一个列表中的所有元素追加至当前列表的尾部。这3个方法都属于原地操作,不影响列表对象在内存中的起始地址。
>>> x = [1, 2, 3] >>> id(x) #查看对象的内存地址 50159368 >>> x.append(4) #在尾部追加元素 >>> x.insert(0, 0) #在指定位置插入元素 >>> x.extend([5, 6, 7]) #在尾部追加多个元素 >>> x [0, 1, 2, 3, 4, 5, 6, 7] >>> id(x) #列表在内存中的地址不变 50159368
pop()、remove()、clear()
- pop()用于删除并返回指定位置(默认是最后一个)上的元素;remove()用于删除列表中第一个值与指定值相等的元素;clear()用于清空列表中的所有元素。这3个方法也属于原地操作。
- 另外,还可以使用del命令删除列表中指定位置的元素,同样也属于原地操作。
>>> x = [1, 2, 3, 4, 5, 6, 7] >>> x.pop() #弹出并返回尾部元素 7 >>> x.pop(0) #弹出并返回指定位置的元素 1 >>> x.clear() #删除所有元素 >>> x [] >>> x = [1, 2, 1, 1, 2] >>> x.remove(2) #删除首个值为2的元素 >>> del x[3] #删除指定位置上的元素 >>> x [1, 1, 1]
count()、index()
- 列表方法count()用于返回列表中指定元素出现的次数;index()用于返回指定元素在列表中首次出现的位置,如果该元素不在列表中则抛出异常。
>>> x = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4] >>> x.count(3) #元素3在列表x中的出现次数 3 >>> x.count(5) #不存在,返回0 0 >>> x.index(2) #元素2在列表x中首次出现的索引 1 >>> x.index(5) #列表x中没有5,抛出异常 ValueError: 5 is not in list
sort()、reverse()
- 列表对象的sort()方法用于按照指定的规则对所有元素进行排序;reverse()方法用于将列表所有元素逆序或翻转。
>>> x = list(range(11)) #包含11个整数的列表 >>> import random >>> random.shuffle(x) #把列表x中的元素随机乱序 >>> x [6, 0, 1, 7, 4, 3, 2, 8, 5, 10, 9] >>> x.sort(key=lambda item:len(str(item)), reverse=True) #按转换成字符串以后的长度,降序排列 >>> x [10, 6, 0, 1, 7, 4, 3, 2, 8, 5, 9] >>> x.sort(key=str) #按转换为字符串后的大小,升序排序 >>> x [0, 1, 10, 2, 3, 4, 5, 6, 7, 8, 9] >>> x.sort() #按默认规则排序 >>> x [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> x.reverse() #把所有元素翻转或逆序 >>> x [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
- max()、min()函数用于返回列表中所有元素的最大值和最小值,
- sum()函数用于返回列表中所有元素之和;
- len()函数用于返回列表中元素个数,zip()函数用于将多个列表中元素重新组合为元组并返回包含这些元组的zip对象;
- enumerate()函数返回包含若干下标和值的迭代对象;
- map()函数把函数映射到列表上的每个元素,filter()函数根据指定函数的返回值对列表元素进行过滤;
- all()函数用来测试列表中是否所有元素都等价于True,any()用来测试列表中是否有等价于True的元素。
- 标准库functools中的reduce()函数以及标准库itertools中的compress()、groupby()、dropwhile()等大量函数也可以对列表进行操作。
>>> x = list(range(11)) #生成列表 >>> import random >>> random.shuffle(x) #打乱列表中元素顺序 >>> x [0, 6, 10, 9, 8, 7, 4, 5, 2, 1, 3] >>> all(x) #测试是否所有元素都等价于True False >>> any(x) #测试是否存在等价于True的元素 True >>> max(x) #返回最大值 10 >>> max(x, key=str) #按指定规则返回最大值 9 >>> min(x) 0 >>> sum(x) #所有元素之和 55 >>> len(x) #列表元素个数 11 >>> list(zip(x, [1]*11)) #多列表元素重新组合 [(0, 1), (6, 1), (10, 1), (9, 1), (8, 1), (7, 1), (4, 1), (5, 1), (2, 1), (1, 1), (3, 1)] >>> list(zip(range(1,4))) #zip()函数也可以用于一个序列或迭代对象 [(1,), (2,), (3,)] >>> list(zip(['a', 'b', 'c'], [1, 2])) #如果两个列表不等长,以短的为准 [('a', 1), ('b', 2)] >>> enumerate(x) #枚举列表元素,返回enumerate对象 <enumerate object at 0x00000000030A9120> >>> list(enumerate(x)) #enumerate对象可以转换为列表、元组、集合 [(0, 0), (1, 6), (2, 10), (3, 9), (4, 8), (5, 7), (6, 4), (7, 5), (8, 2), (9, 1), (10, 3)]