认识列表
列表(list) 是可变序列,是Python 最基本的数据结构之一,常用于存放同类项目的容器。Python对列表元素的类型没有严格的限制,每个元素可以是不同的类型。但是从代码的可读性和执行效率考虑,建议统一列表元素的数据类型。
列表具有如下特点。
- 列表是有序的数据结构。内部数据的位置排列固定。
- 通过下标索引访问内部数据。支持迭代和切片操作。
- 列表是可变的数据类型。可以随意添加、删除和更新内部数据,列表会自动伸缩,确保内部数据无缝隙有序排列。
- 内部数据统称为元素,元素的值可以重复,可以为任意类型的数据,如数字、字符串、列表、元组、字典和集合等。
- 列表的字面值:在中括号内存放所有元素,元素之间使用逗号分隔。
构建列表
以中括号作为起始和终止标识符,其中包含零个或多个元素,元素之问通过逗号分隔。如果不包含任何元素,则表示一个空列表对象。语法如下:
[元素1,元素2,元素3,...,元素n]
使用list构造器可以将可迭代对象转换为列表,语法如下:
list() list(iterable)
如果不包含任何参数,将创建一个空列表。构造器将构造一个列表,其中的项与 iterable 中的项具有相同的值与顺序。iterable可以是序列、支持选代的容器,或者其他可选代对象。
list1 = [] # 定义空列表 list2 = [1,2,3] # 直接定义列表 list3 = ['a',2,3] # 不同类型列表 list4 = list([1,2,3]) # 列表转列表 list5 = list((1,2,3)) # 元组转列表 list6 = list(range(1,4)) # 数字范围转列表 list7 = list({'a':1,'b':2,'c':3}) # 字典转列表 ['a','b','c'] list8 = list({1,2,3}) # 集合转列表 list9 = list('123) # 字符串转列表 list10 = list() # 空列表
列表推导式
推导式又称解析式,是可以从容器构建另一个新的数据容器的结构体,语法简洁,运行速度快,性能比循环好,列表推导式的语法格式如下:
[expr for value in iterable if condition] # 类似于 for 循环结构 result = [] # 定义一个空列表 for value in iterable: # 遍历iterable迭代器对象 if condition: # 如果条件表达式为True result.append(expression) # 把该元素的值添加到列表中
其中,expr 表示一个表达式,value 表示与iterable 包含元素相关的值表达式,iterable 表示一个可迭代的对象,condition 表示要过滤的条件。过滤条件可选,取决于实际应用。
l1 = [i for i range(10)] print(l1) # 输出[0,1,2,3,4,5,6,7,8,9] l2 = [[i,char] for i,char in enumerate('python')] print(l2) # 输出[[0,'p'],[1,'y'],[2,'t'],[3,'h'],[4,'o'],[5,'n']]
(1) for 循环前面加 iterable这种形式生成的元素个数不会少,只是根据 for 循环的结果使用不同的表达式。
(2) for 循环后面加 if。这种形式只选择符合条件的元素,所以元素个数与系件相关。
(3) 嵌套 for 循环。
l3 = [i if i%2 == 0 else 0 for i in range(10)] print(l3) # 输出[0,0,2,0,4,0,6,0,8,0] l4 = [i for in range(10) if i%2 == 0] print(l4) # 输出[0,2,4,6,8] m = [[1,2,3],[4,5,6],[7,8,9]] n = [col for row in m for col in row] # 嵌套for print(n) # 输出[1,2,3,4,5,6,7,8,9] n = [] # 定义临时列表 for row in m: # 遍历外层列表 for col in row: # 遍历内层列表 n.append(col) # 把元素添加到临时列表中 print(n) # 输出[1,2,3,4,5,6,7,8,9] name = ['Bob','Tom',alice','Jerry','Wendy','Smith'] l5 = [name.upper() for name in names if len(name) > 3] # 先条件过滤,然后转换为大写 print(l5) # 输出['ALICE','JERRY','WENDY','SMITH']
操作列表
访问元素
访问元素,顾名思义就查看列表中元素,常见的有赋值和切片操作。
list 表示列表对象,index 表示下标索引,index 起始值为0,第一个元素的下标为0,最后一个元素的下标为len(list)-1。其中,len()函数可以统计列表元素的个数。
index 可以为负值,负值素列表示从右往左数,由-1开始,-1表示最后一个元素,负列表长度表示第一个元素。访问元素的语法格式如下:
list[index] list1 = [1,2,3] print(list1[-1]) # 输出 3
赋值或更新元素,value 为要赋的值,类型不限,index 不能超出索引范围,
list[index] = value
使用count()
方法可以统计列表中指定元素出现的次数,如果不存在,则返回0。
list1 = [1,2,3,4,1,1] print(list1.count(1)) # 输出 3 print(list1.count(5)) # 抛出异常
使用index()
方法可以获取指定元素的下标索引。
list 表示列表对象,参数value 表示元素的值。start 和stop 为可选参数,start 表示起始检索的位置,包含start 所在位置,stop 表示终止检索的位置,不包含stop 所在的位置。
index()
方法将在指定范围内,从左到石查找第一个匹配的元素,然后返回它的下标索引值。
list.index(value,start,stop) list1 = [1,2,3,4,5,5,4,3,2,1,4,2,4] print(list1.index(4,7,12)) # 输出 10 print(list1.index(20)) # 抛出异常
切片访问元素。
list 表示列表对象;start index:表示开始索引位置,默认为 0,包含该索引位置;end index:表示结束索引位置,默认为序列长度 len(sequence),不包含该索引位置;step:表示步长,默认为 1,但是不能为 0。
list[start_index:end_index:step] list1 = [3,4,5,6,7,8,9,11,13,15,17] print(list1[::]) # 输出所有元素 print(list1[::-1]) # 倒序元素 print(list1[100]) # 抛出异常 print(list1[100:]) # [] 空列表 print(list1[:100:1]) # 超出范围的显示 [] 空列表
如果指定下标超出列表的索引范围或者指定的元素不存在,将会抛出异常。但切片操作不会因为下标超出而抛出异常,而是简单地在序列尾部截断或者返回一个空序列。
遍历元素
遍历就是对列表中每个元素执行一次访问,常用于数据过滤处理。
使用while
和len()
函数可以遍历列表。
list1 = ['a','b','c'] i = 0 while i < len(list1): # 遍历列表 list[i] = list1[i].upper() # 读取每个元素,然后转换为大写形式,再写入 i += 1 # 下标自增 print(list1) # 输出 ['A','B','C']
for 主要用于遍历可选代对象,该语句语法简洁,且运行高效。item 引用每个元素,iterable 表示可迭代对象。当遍历所有元素之后,for 自动停止迭代。具体语法格式如下:
for item in iterable: # 处理语句 list1 = ['a','b','c'] for in list1: # 遍历列表 list1[list1.index(i)]=i.upper # 读取每个元素,然后转换为大写形式,再写入 print(list1) # 输出 ['A','B','C'] list2 = ['a','b','c','d'] for index,value in enumerate(list1): # 遍历enumerate元素 list1[index] = value.upper() # 读取每个元素,然后转换为大写形式,再写入 print(list2) # 输出 ['A','B','C','D']
添加元素
使用append()
方法可以再当前列表尾部追加元素,该方法执行效率高。list 表示对象,参数obj表示要添加到列表末尾的值。该方法在原列表上执行操作,没有返回值,语法如下:
list.append(obj) list1 = ['a','b','c'] list1.append('d') # 追加一个元素 print(list1) # 输出['a','b','c','d']
使用extend()
方法可以将一个可选代对象的所有元素添加到当前列表对象的尾部。通过extend()
方法增加列表元素也不会改变当前列表对象的内存地址,属于原址操作。
a = [1,2,4] print(id(a)) # 内存地址:878351704712 a.extend([7,8,9]) # 追加序列 print(a) # 输出[1,2,4,7,8,9] print(id(a))# 内存地址:878351704712
使用列表对象的insert()
方法可以将元素添加到指定下标位置。参数 index 表示插入的索引位置;obj 表示要插入列表中的对象。该方法没有返回值,只是在原列表指定位置插入对象。语法格式如下:
list.insert(index, obj) a = [1,2,3,4] print(id(a)) # 内存地址:47959883021 a.insert(3,6) # 下标为3的位置插入6 print(a) # 输出[1,2,3,6,4] print(id(a))# 内存地址:47959883021
使用切片
list1 = [3,5,7] list1[len(list1):]=[9] # 在尾部追加元素 list1[:3] = [1,2,3] # 替换前3各元素
删除元素
使用del
命令可以刪除列表中指定位置的元素。
a = [1,2,3,4] del a[2] print(a) # 输出 [1,2,4]
使用pop()
方法可以刪除并返回指定位置上的元素。语法格式如下:
list.pop(index=-1)
参数 index 表示要移除列表元素的索引值,默认值为-1,即删除最后一个列表值。如果给定的索引值超出了列表范围,将抛出异常。
a = [1,2,3,4] e = a.pop() # 删除最后一个元素 print(a) # 输出 [1,2,3] print(e) # 输出 4
使用remove()
方法删除首次出现的指定元素。参数 obj 表示列表中要移除的对象,即列表元素的值。该方法没有返回值,如果列表中不存在要刷除的元素,则抛出异常。语法如下:
list.remove(obj) a=[1,2.2,2,2,3,4,2,3,2,4] for i in a[::]: # 遍历切片 if 2 == i: # 设置删除条件 a.remove(i) # 刷除元素2 print(a) # 输出为 [1,3,4,3,4] for i in range(len(a)-1,-1): # 从后往前检查 ifa[i] == 2: # 设置删除条件 del a[i] # 删除元素2 print(a) # 输出为 [1,3,4,3,4]
使用clear()
方法可以删除列表中所有元素。该方法没有参数,也没有返回值。
a = [1,2,3,4] a.clear() print(a)
使用切片
list1 = [3,5,7,9,11] del list1[:3] # 删除前3各元素 list1[:] = [] # 删除所有元素
复制列表
浅复制就是只复制列表对象的浅层关系,不再深入复制每个值所引用的对象。
import copy x = [1,2,[3,4]] y = copy.copy(x) # copy()函数浅复制 print(id(x[2])) # 内存地址:2891781245440 print(id(y[2]))# 内存地址:2891781245440
深复制将会递归复制对象的所有子对象。使用copy模块的deepcopy()函数可以执行深复制。
import copy x = [1,2,[3,4]] y = copy.deepcopy(x) # deepcopy()函数浅复制 print(id(x[2])) # 内存地址:2891781245440 print(id(y[2]))# 内存地址:2438547682368
使用切片,这也是浅复制
x = [1,2,[3,4]] y = x[:] print(id(x[2])) # 内存地址:2891781245440 print(id(y[2]))# 内存地址:2891781245440
删除列表
使用del
命令可以删除列表。
list1 = [1,2,3] del list1 # 删除列表 print(list1) # 抛出异常