内容正文:
专题六 Python列表
[考纲要求]
1.了解列表的定义
2.掌握列表的创建和列表函数
3.掌握字符串的索引和切片
4.掌握的专用操作
5.掌握序列对象的内置函数
6.了解深拷贝和浅拷贝
7.了解序列的拆分赋值
[课时安排]
2课时
[知识梳理]
列表定义
列表(list)可变的数据类型,是一个容器,可以存放任意数据类型,里面的每一个数据项称为一个元素。
创建列表的方法
# 创建空的列表
list1 = [] # 方法1
list2 = list() # 方法2
# 字符串转列表
str1 = "hello"
print(list(str1)) # ['h', 'e', 'l', 'l', 'o']
列表的索引和切片操作
列表的取索引和切片操作和字符串一样,掌握了字符串的操作就掌握了列表的操作。
这里简单的介绍一下:
1) 索引 通过索引对列表中的元素进行访问,语法格式如下:
列表名[索引] 索引不能越界,否则会出现IndexError的错误
2) 切片 通过切片操作可以从列表中取出某个范围的元素,从而构成新的列表。语法格式如下:
列表名[起始索引:终止索引:步长]
列表的连接和复制操作
列表1+列表2
>>> [1,2,3]+[4,5,6]
[1, 2, 3, 4, 5, 6]
列表*整数 或 整数*列表
>>> [1,2,3]*3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> 2*["AB","CD"]
['AB', 'CD', 'AB', 'CD']
列表的比较和检查成员
1)列表的比较 首先比较两个列表的第一个元素,如果这两个元素相等,则继续后面的对应的两个元素;如果这两个元素不相等,则返回这两个元素的比较结果。重复这个过程,直至出现不相等的元素或比较完所有元素为止.
>>> [1,2,3,4]<[1,2,1,2,3]
False
>>> [2,5,8]>[1,2,6,1]
True
2)检查成员资格 使用in 运算符可以判断一个值是否包含在列表中
>>> 1 in [1,2,3]
True
>>> 9 in [1,2,3]
False
>>> 6 not in [1,2,3]
True
>>> [1] in [1,2,3] # 将[1]看作整体
False
>>> [1] in [[1],2,3]
True
列表的拆分赋值和专用操作
1) 拆分赋值
x,y,z = [1,2,3]
print(x,y,z) # 1 2 3
# 上面的操作字符串、元组、集合、字典同样支持
进行拆分赋值时,要求变量个数必须与列表元素个数相等,否则会出现ValueError的错误
如何解决上面的问题,就在变量前面加*
*a, b, c = [1, 2, 3, 4, 5, 6]
print(a) # [1,2,3,4]
a, *b, c = [1, 2, 3, 4, 5, 6]
print(b) # [2,3,4,5]
a, b, *c = [1, 2, 3, 4, 5, 6]
print(c) # [3,4,5,6]
2) 专用操作
列表对象是可变的序列,对列表除了可以使用序列的通用操作,还可以进行一些专用的操作。例如元素赋值、切片赋值、元素删除等。
2.1 列表元素赋值
列表对象[索引]=新的值
lst = [1, 2, 3, 4]
lst[1] = 100
lst[2] = 200
print(lst) # [1,100,200,4]
2.2 列表元素添加
列表对象.append(值) # 值看作整体
lst = [1, 2, 3, 4]
lst.append(5)
print(lst) # [1, 2, 3, 4, 5]
lst.append([6,7])
print(lst) # [1,2,3,4,5,[6,7]]
2.3列表对象.extend(seq) # 将seq中的元素添加到列表的末尾
lst=[1,2,3,4]
lst.extend([5,6])
print(lst) # [1, 2, 3, 4, 5, 6]
2.4列表对象.insert(索引,值)
lst = [1, 2, 3, 4]
lst.insert(2, "hello")
print(lst) # [1, 2, 'hello', 3, 4]
特别说明:如果索引超出列表对象的最大索引值,则会将值添加到列表的最后面。
lst = [1, 2, 3, 4]
lst.insert(4, "hello")
print(lst) # [1, 2, 3, 4, 'hello']
2.5 列表元素删除
从列表中删除指定的元素,可以使用del语句来实现。
lst = [1, 2, 3, 4]
del lst[0]
del lst[1]
print(lst) # [2, 4]
2.6 列表对象.sort(key=func,reverse=False)
其中key指定排序规则。reverse的值为False升序排序,reverse的值为True降序排序,默认值为False。
lst=[3,1,2,6,5,4]
lst.sort()
print(lst) # [1, 2, 3, 4, 5, 6]
lst=[3,1,2,6,5,4]
lst.sort(reverse=True)
print(lst) # [6, 5, 4, 3, 2, 1]
lst=[(3,1),(2,3),(1,2)]
def func(n):
return n[1]
lst.sort(key=func) # 指定按照每个元素里面的第二值排序
print(lst) # [(3, 1), (1, 2), (2, 3)]
2.7 lst.remove(x) 使用该方法可以从列表lst中删除第一个值为x的元素,如果列表中不存在这样的元素则会出现ValueError错误,例如:
2.8 lst.pop(i) 使用该方法可以从列表lst中弹出索引为i的元素,然后删除并返回该元素;如果未指定参数i,则会弹出列表中的最后一个元素;如果指定的参数i越界,则会出现IndexError的错误,例如:
2.9 lst.count(x)使用该方法可以返回元素x在列表lst中出现的次数。例如:
3.0 lst.index(x[,start,end]) 使用该方法返回元素x在列表lst中第一次出现的索引值,如果元素x未包含在列表lst中,则会出现ValueError的错误。例如:
3.1 lst.reverse( ) 使用该方法可以反转列表list中所有元素。例如:
3.2 lst.copy( ) 使用该方法可以复制列表list中所有元素(浅拷贝)。例如:
list1 = [1, 2, 3, 4, 2]
list2 = list1.copy()
list2.reverse()
print(list1) # [1, 2, 3, 4, 2]
print(list2) # [2, 4, 3, 2, 1]
3.3 列表的批量赋值和删除(切片赋值)
大家有没有发现,上面的赋值操作和删除操作,如果遇到多个值的操作,显然会代码允余。那么我们来进行批量的操作。
切片赋值:通过切片赋值可以使用一个值列表来修改指定范围的一组元素的值。
当提供的值列表长度等于切片的长度,对应的值会被修改。
>>> list1=[1,2,3,4,5,6]
>>> list1[1:4] = [200,300,400]
>>> list1
[1, 200, 300, 400, 5, 6]
>>>
当提供的值列表长度不等于切片的长度:
1.如果提供的值列表长度大于切片的长度,则会插入新的元素。例如:
>>> list1=[1,2,3,4,5,6]
>>> list1[1:4]=[120,130,140,150,160]
>>> list1
[1, 120, 130, 140, 150, 160, 5, 6]
2.如果提供的值列表长度小于切片的长度,则会删除多出的元素。例如:
>>> list1=[1,2,3,4,5,6]
>>> list1[1:4]=[200,300]
>>> list1
[1, 200, 300, 5, 6]
3.当进行切片赋值的时候,如果步长不等于1,则要求提供的值列表长度必须与切片长度相等,否则将出现ValueError错误,例如:
>>> list1=[1,2,3,4,5,6,7,8,9,10]
>>> list1[0:10:2]=[11,22,33,44,55]
>>> list1
[11, 2, 22, 4, 33, 6, 44, 8, 55, 10]
>>> list1[0:10:2]=[100,200,300]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: attempt to assign sequence of size 3 to extended slice of size 5
批量删除
若要从列表删除指定范围内的元素,也可以通过切片赋值来实现,例如:
>>> list1=[1,2,3,4,5,6]
>>> list1[1:4]=[]
>>> list1
[1, 5, 6]
适用于序列对象的内置函数
为了便于使用列表,Python提供了一些内置函数,这些函数不仅可以应用于列表,还可以应用于其他可迭代类型,例如字符串、元组等。
1) len(seq) 返回序列的长度 既序列中包含的元素个数 例如:
lst = [1, 2, 3, 4, 5]
print(len(lst)) # 5
2) max(iterable, key=func) 返回序列中的最大元素,例如:
注意: max()的参数是可迭代对象且不能是复数(因为复数和复数不能比较)
lst = [1, 2, 3, 4]
print(max(lst)) # 4
print(max("hello")) # "o"
print(max(1,2,3,4,5)) # 5
print(max(1))
# TypeError: 'int' object is not iterable
当列表中的元素是字符,则返回ASCII最大的元素
lst = ["a", "c", "b"]
print(max(lst)) # c
lst=["1",'11','22','333','444']
print(max(lst,key=len)) # '333'
print(max(1,True,0)) # 1
print(max(True,1,0)) # True
值和长度相同时,谁在前面返回谁
当列表中的元素是字符串,其实就是字符串之间比较,找出字符串最大的
list1 = ["aello", "corld", "bython"]
print(max(list1))
3) min( ) 返回序列中的最小元素,例如:
list1 = [1, 2, 3, 4, 5]
print(min(list1)) # 1
4) sorted(iterable,key=None,reverse=False ) 对可迭代对象进行排序操作并返回排序后的新列表,原始列表不变,参数iterable表示可迭代类型,参数key指定一个函数,实现自定义排序,默认为None,参数reverse用于指定规则,设置为True则按降序排序,默认为False的话表示按升序排序。例如:
list1 = [10, 3, 1, 2, 6, 4]
list2 = sorted(list1)
print(list2) # [1, 2, 3, 4, 6, 10]
list2 = sorted(list1, reverse=True)
print(list2)
st = "hello"
print(sorted(st)) # ['e', 'h', 'l', 'l', 'o']
print(''.join(sorted(st))) # 'ehllo'
sorted( )函数与sort( )函数对比:
1.sort()函数只能对列表排序,且会修改原来的列表
2.sorted()函数可以对任意序列对象排序,且不会修改原来的列表
5) sum(seq) 对序列进行求和计算,参数seq可以是列表、元组、集合、字典不能是字符串
list1 = [1, 2, 3, 4]
print(sum(list1)) # 10
深拷贝和浅拷贝
lst=[1,2,3,[4,5,6]]
定义:上面的列表中,lst称为父对象,[4,5,6]相对于lst为子对象 而元素1,2,3称为父对象的一级元素,而4,5,6称为二级元素
浅拷贝: 只负责父对象的一级元素,并不复制子对象中的元素.因此浅拷贝之后,二级元素任然共用一个地址
深拷贝: 复制父对象的一级元素也会复制二级元素。
举例:
# 浅拷贝
lst = [1, 2, 3, [4, 5, 6]]
lst1 = lst.copy()
lst1[3][1] = 50
print(lst[3][1]) # 50
print(lst1[3][1]) # 50
# 深拷贝
import copy
lst = [1, 2, 3, [4, 5, 6]]
lst1=copy.deepcopy(lst)
lst[3][1]=50
print(lst[3][1]) # 50
print(lst1[3][1]) # 5
[限时练习]
1.print(list("hello"))的运行结果__________
【答案】['h', 'e', 'l', 'l', 'o']
【解析】将字符串的每个字符转为列表的元素
2.下面代码的运行结果__________
lst=[1,2,3,4,5,6,7,8,9]
print(lst[1::3])
【答案】[2, 5, 8]
【解析】步长为3,省略结束索引表示取片到字符串的末尾
3.下面代码的运行结果__________
lst=[1,2,3,4,5,6,7,8,9]
print(lst[:3:-2])
【答案】[9, 7, 5]
【解析】步长为-2,省略开始索引表示从字符串的头(索引为-1)开始取切片到索引3(不包含索引3)
4.下面代码的运行结果__________
lst1=[1,2]
lst2=[4,5]
print(lst1*2+lst2*3) 的运行结果__________
【答案】[1, 2, 1, 2, 4, 5, 4, 5, 4, 5]
【解析】lst1*2的值[1,2,1,2] lst2*3的值为[4,5,4,5,4,5] 列表拼接之后[1, 2, 1, 2, 4, 5, 4, 5, 4, 5]
5. print([2,3,4]>[2,3,3])的运行结果__________
【答案】True
【解析】左侧的列表与右侧的列表前面两个元素相同,第三个元素左侧的大,则左侧的列表大
6. print([1] in [1,2,3])的运行结果__________
【答案】False
【解析】[1]看作整体,显然不在列表[1,2,3]里面
7. print([1] in [[1],2,3])的运行结果__________
【答案】True
【解析】[1]看作整体,显然在列表[1,2,3]里面
8.下面代码的运行结果__________
x,y,z=[2,3,4]
print(x**y%z)
【答案】0
【解析】x**y的值为8 8%4的值为0
9.下面代码的运行结果__________
lst=[1,2,3,4]
lst[1]=20
print(lst)
【答案】[1, 20, 3, 4]
【解析】将索引1位置的元素修改为20
10.下面代码的运行结果__________
lst=[1,2,3,4]
lst.append([5,6])
lst.extend([7,8])
print(lst)
【答案】[1, 2, 3, 4, [5, 6], 7, 8]
【解析】append([5,6]) 将[5,6]添加到列表的末尾 extend([7,8])将列表[7,8]的元素依次添加到列表的末尾
11.下面代码的运行结果__________
lst=[1,2,3,4,5]
lst.insert(2,'h')
print(lst)
【答案】[1, 2, 'h', 3, 4, 5]
【解析】将字符'h'添加到索引2位置元素的前面
12.下面代码的运行结果__________
lst=[1,2,3,4,5]
lst.insert(6,'h')
print(lst)
【答案】[1, 2, 3, 4, 5, 'h']
【解析】若添加的索引大于列表的最大索引,则添加到列表的末尾
13.lst=[1,2,[3,4,5,[6,7,8]]];print(len(lst))
【答案】3
【解析】通过观察[3,4,5,[6,7,8]]是一个列表,因此长度为3
[归纳小结]
学科网(北京)股份有限公司
$$