目录
列表
一个列表中的数据类型可以各不相同。
列表中每个数据称为元素。
所有元素用逗号隔开,并放在一对中括号"[]"中。
列表的创建
赋值运算符"="将一个列表赋值给变量即可创建列表对象。
a_list = ['1','2'] #创建一个列表,元素为'1','2'
b_list = [] #创建一个空列表
>>>list((1,2,3)) #将元组转换成列表
[1,2,3]
>>>list(range(1,10,2)) #将range对象转换成列表
[1,3,5,7,9]
>>>list('python') #将字符串转换为列表
['p','y','t','h','o','n']
>>>list({'a':'1','b':'2','c':'3'}) #将字典的键转换为列表
['a','b','c']
>>>list({'a':'1','b':'2','c':'3'}.items()) #将字典的键值对转化为列表
[('a',1),('b',2),('c',3)]
列表推导式:list1 = [表达式 for 表达式1 in 序列 if 条件] #针对序列中,满足条件的表达式1,做表达式。
>>>aList = [-1,-4,6,7.5,9]
>>>[i*2 for i in aList if i>0] #针对aList中的满足大于0的元素i做乘2
[12,15,18]
列表元素的查找
读取元素
索引:列表名[索引]
>>>a_list = [1,2,3]
>>>a_list[1]
2
>>>a_list[5] #越界索引报错
IndexError:list index out of range
切片:列表名[开始索引,结束索引,步长] #索引左闭右开
切片返回一个新列表,地址改变,越界索引不报错。通常在尾部截断或返回一个空列表。
>>>a_list = [1,2,3,4,5]
>>>a_list[1:3] #左闭右开
[2,3]
>>>a_list[1:-1] #索引从右往左从-1开始
[2,3,4]
>>>a_list[1:] #end省略默认到尾部且包括尾部
[2,3,4,5]
>>>a_list[:3] #start省略默认从起始开始
[1,2,3]
>>>a_list[:] #end,start均省略输出列表
[1,2,3,4,5]
>>>a_list[::2] #步长为2,省略为1
[1,3,5]
>>>a_list[3:10] #越界索引不报错,从尾部阶段
[4,5]
>>>a_list[10,18] #起始越界报错
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
a_list[10,18]
TypeError: list indices must be integers or slices, not tuple
读取位置
使用index()函数可以获取指定元素首次出现的下标。
一般形式:index(value,[,start=0,[,end=len(seq)]]) #等号后面为默认值,start省略为起始,end省略为尾部。
>>>a_list = ["a","b","c","d","c"]
>>>a_list.index("c") #元素"c"首次出现的索引
2
>>>a_list.index("c",3) #起始位置3
4
>>>a_list.index("c",0,2) #指定范围内无"c",报错
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
a_list.index("c",0,2)
ValueError: 'c' is not in list
列表元素的增加
append()函数用于向列表尾部追加一个元素。
>>>a_list = [1,2,3]
>>>a_list.append(4)
>>>a_list
[1,2,3,4]
也常用append()与循环结构创建列表:
先list1=[] ,再for循环中执行list1.append(元素)
insert()方法用于向列表任意指定位置插入一个元素。
一般形式:list.insert(索引,插入对象)
>>>a_list = [1,2,3]
>>>a_list.insert(0,0)
>>>a_list
[0,1,2,3]
extend()函数用于将另一个列表中的所有元素追加到当前列表的尾部。
>>>a_list = [1,2,3]
>>>a_list.extend([4,5,6])
>>>a_list
[1,2,3,4,5,6]
以上三种方法均属于原地操作,不影响对象在内存中的起始地址。
使用"+"连接运算符将一个新列表的元素添加在列表的尾部但不属于原地操作,而是返回一个新列表,涉及大量元素的复制,效率低下。
>>> a_list = [1,2,3]
>>> id(a_list)
2904542657216
>>> a_list = a_list + [4] #连接两个列表
>>> a_list
[1, 2, 3, 4]
>>> id(a_list) #地址发生改变
2904542838080
使用"+="实现列表追加元素属于原地操作,和append()方法一样高效。
>>> a_list = [1,2,3]
>>> id(a_list)
2904542838080
>>> a_list += [4] #连接两个列表
>>> a_list
[1, 2, 3, 4]
>>> id(a_list) #地址不发生改变
2904542838080
同样的,"*"重复运算符可以用与列表和整数相乘,表示序列重复,返回新列表。运算符"*="属于本地操作。
>>>a_list = [1,2,3,4,5]
>>> id(a_list)
2904542838080
>>> a_list = a_list * 2 #使用"="重复运算符
>>> a_list
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
>>> id(a_list) #地址发生改变
2904510956864
>>> a_list *= 2 #使用"*="重复运算符
>>> a_list
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
>>> id(a_list) #地址不发生改变
2904510956864
使用切片为列表增加元素
可以使用切片操作在列表任意位置插入新元素,属于原地操作。
列表名称[起始索引,结束索引] = [插入的元素]
>>>a_list = [1,2,3]
>>>a_list[len(a_list):] = [4] #在列表尾部增加新元素
>>>a_list
[1,2,3,4]
>>>a_list[:0] = [0] #在列表头部增加新元素
>>>a_list
[0,1,2,3,4]
>>>a_list[3:3] = [6] #在列表指定位置增加新元素
>>>a_list
[0,1,2,6,3,4]
列表元素的删除
用del命名删除列表中指定的元素或整个列表,属于原地操作。
>>> a_list = [1,2,3]
>>> del a_list[0] #删除指定位置的元素
>>> a_list
[2, 3]
>>> del a_list #删除整个列表
>>> a_list #已删除列表,所以输出列表的操作将报错
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
a_list
NameError: name 'a_list' is not defined
pop()函数用于删除并返回指定位置index(默认最后一个)上的元素。
>>> a_list = [1,2,3]
>>> a_list.pop(1) #删除指定位置的元素,并返回该元素的值
2
>>> a_list
[1, 3]
>>> a_list.pop() #不指定元素默认最后一个
3
>>> a_list
[1]
>>> a_list.pop(1) #index不是区间上的整数则报异常
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
a_list.pop(1)
IndexError: pop index out of range
remove(x)函数用于删除列表中第一个与指定值相同的元素,如列表中不存在与指定值相同的数则抛出异常。
>>> a_list = [1,3,2,3]
>>> a_list.remove(3) #删除列表中第一个与指定值相同的元素
>>> a_list
[1, 2, 3]
>>> a_list.remove(4) #若指定值不在列表中则抛出异常
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
a_list.remove(4)
ValueError: list.remove(x): x not in list
clear()函数用于清空列表中的元素。(不是删除列表)
>>> a_list = [1,2,3]
>>> a_list.clear() #清空列表中的函数
>>> a_list
[] #列表还存在,只是被清空成了空列表
使用切片替换和修改列表中的元素
列表名[起始索引,结束索引] = []
>>> a_list = [1,2,3,4,5]
>>> a_list[:4] = [9,8,7,6] #替换列表元素,等号两边列表长度应相等
>>> a_list
[9, 8, 7, 6, 5]
>>> a_list[3:] = [7,8,988] #切片连续(步长为1),等号两边长度可以不相等
>>> a_list
[9, 8, 7, 7, 8, 988]
>>> a_list[::2] = [1,1,1] #切片不连续,等号两边长度必须相等
>>> a_list
[1, 8, 1, 7, 1, 988]
>>> a_list[::2] = [1] #切片不连续,等号两边长度必须相等,不相等则报错
Traceback (most recent call last):
File "<pyshell#36>", line 1, in <module>
a_list[::2] = [1]
ValueError: attempt to assign sequence of size 1 to extended slice of size 3
>>> a_list[::2] = [0]*3 #隔一个修改一个
>>> a_list
[0, 8, 0, 7, 0, 988]
>>> a_list[::3] = ["a","b"] #隔三个修改一个
>>> a_list
['a', 8, 0, 'b', 0, 988]
列表的其他常用方法及运算符
sort()函数用于按照指定规则对所有元素进行排序,默认升序。
需要降序则用sort(reverse=Ture)
reverse()函数用于对指定列表,把所有元素进行顺序反转。
以上方法都为原地操作。
>>> a_list = list(range(10)) #创建一个列表,列表由十个整数组成
>>> import random
>>> random.shuffle(a_list) #把列表中的元素随机乱序
>>> a_list
[9, 5, 2, 0, 6, 7, 8, 1, 3, 4]
>>> a_list.sort() #对元素进行排序,默认升序
>>> a_list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a_list.sort(reverse=True) #对元素进行逆序
>>> a_list
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a_list.reverse() #对元素进行顺序反转
>>> a_list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
使用count()函数统计列表中指定元素出现的次数。
>>> a_list = [1,2,3,4,5,5,5,5,5,5,5,55,5,5]
>>> a_list.count(5) #统计指定元素出现的次数
9
>>> a_list.count(6) #若指定元素不存在于列表中则返回0
0
使用in运算符测试列表中是否包含某个元素,返回True或False,查询时间随列表长度增加而线性增加。同样的操作对于集合而言是常数级的。
>>> a_list = [1,2,3]
>>> 3 in a_list #测试列表中是否含有某个元素,含有返回True
True
>>> 4 in a_list #测试列表中是否含有某个元素,不含有返回False
False
>>> 4 not in a_list
True
>>>3 not in a_list
False
列表的常用内置函数
max()、min()函数用于返回列表中所有元素中的最大值和最小值。
sum()函数用来返回列表中所有元素之和。
len()函数用来返回列表中元素的个数。
zip()函数用于将多个列表中元素重新组合为元组,并返回包含这些元组的zip对象。
enumerate()函数返回包含若干下标和值的迭代对象。***
map()函数把函数映射到列表的每个元素。
filter()函数根据指定函数的返回值对列表元素进行过滤。
all()函数用来测试列表中是否所有元素都等价于True。
any()函数用来测试列表中是否有等价与True的元素。
index(x)函数用来从列表中找出与x第一个匹配的索引,若不存在则抛出异常。
>>> a_list = list(range(10)) #生成一个列表,列表中有十个元素
>>> import random
>>> random.shuffle(a_list) #将列表中的元素乱序
>>> a_list
[7, 6, 1, 4, 3, 9, 8, 5, 2, 0]
>>> all(a_list) #测试是否所有元素都等价于True(即1)
False
>>> any(a_list) #测试是否存在等价于True的元素
True
>>> max(a_list) #返回最大值
9
>>> min(a_list) #返回最小值
0
>>> sum(a_list) #计算所有元素的和
45
>>> len(a_list) #输出列表元素个数
10
>>> list(zip(a_list,[1]*10)) #列表元素重新组合成元组,并返回zip对象
[(7, 1), (6, 1), (1, 1), (4, 1), (3, 1), (9, 1), (8, 1), (5, 1), (2, 1), (0, 1)]
>>> list(zip(range(1,4))) #zip()函数也可用于一个序列或迭代对象,且以短的序列为准
[(1,), (2,), (3,)]
>>> enumerate(a_list) #枚举列表元素,返回enumerate对象
<enumerate object at 0x0000018FDC77F8C0>
>>> list(enumerate(a_list)) #enumerate对象可转换为列表、元组、集合,返回索引号跟值
[(0, 7), (1, 6), (2, 1), (3, 4), (4, 3), (5, 9), (6, 8), (7, 5), (8, 2), (9, 0)]