四章、列表
Sparse is better than dense.——The Zen of Python
一、列表概述
列表(List)是Python中的一种数据结构,内置的可变序列。在形式上,列表的所有元素都放在一对中括号“[ ]”中,两个相邻的元素使用逗号“,”进行分割,在内容上,可以将整数、字符串、列表、元组、等任何类型的内容放入列表中,并且同一个列表中,元素的类型可以不同。
二、 列表的创建和删除
在Python中有多种创建列表的方法:
1.使用赋值运算符直接创建列表
在创建列表时,可以直接使用赋值运算符“=”直接将一个列表赋值给一个变量,语法格式如下:
listname = [ element1,element2,element3,···,element n]
listname: 列表的名称
element1 :列表中的元素
1 num = [220,284,1210,1184,26] 2 strlist=['雨霓同学','年龄','性别',['编号,组成']] 3 strlist2 = ['150000001','男'] 4 print(num,strlist,strlist2)
在使用列表时,虽然可以将不同类型的数据放入到同一列表中,但是通常情况下,并不会这样做,而是在一个列表中只放入一种类型的数据,这样可以提高程序的可读性。
2.创建空列表
在Python中,眱创建空列表,例如创建一个名为ceshilist的空列表,则可以使用如下代码:ceshilist = [].
3. 创建数值列表
在Python中,可以使用list()函数直接将range()函数循环出来的结果转换为列表。list()函数的基本语法如下:
list(data) 其中data表示可以转换为列表的数据,其类型可以是range对象、字符串、元组或者其他可迭代的类型数据。
list1=list(range(0,10,2)) print(list1) 输出: [0, 2, 4, 6, 8]
4.删除列表
对于已经创建的列表,不在使用时,可以使用del语句将其删除。语法格式为:del listname listname为要删除列表的名称。一般这玩意不太用。在Python自带的垃圾回收机制会自动销毁不用的列表,所以即使我们不手动将其删除,Python也会将其自动回收。但是列表要是不存在,在进行删除操作时,则会报错。
三、访问列表元素
在Python中,可以直接使用print()函数将列表内容进行输出
1 list1=['雨霓同学',220,284,"亲和数对:1210&1184",['人生苦短,我用python']] 2 print(list1) 3 输出: 4 ['雨霓同学', 220, 284, '亲和数对:1210&1184', ['人生苦短,我用python']]
从上述实例可以看出,在输出列表时,是包括左右两侧的中括号的。如果不想要输出全部元素,也可以通过列表的索引获取指定的元素。这与之前的访问序列的方法是一样的。
3.1 遍历列表
遍历列表中的所有元素是常用的一种操作,在遍历的过程中可以完成查询、处理等功能,Python中遍历列表的方法有多种。可以使用如下的方法进行列表的遍历。
1.直接使用for循环实现
使用for循环遍历列表,只能输出元素的值,其语法格式如下:
for item in listname
item: 用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可
listname: 列表名称
示例如下:
1 list1=['雨霓同学',220,284,"亲和数对:1210&1184",['人生苦短,我用python']] 2 for item in list1: 3 print(item) 4 输出: 5 雨霓同学 6 220 7 284 8 亲和数对:1210&1184 9 ['人生苦短,我用python']
2.使用for循环和enumerate()函数实现
使用for循环和enumerate()函数可以实现同时输出索引值和元素的功能,其语法格式如下:
for index,item in enumerate(listname)
index:用于保存元素的索引
item: 用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可。
listname: 列表的名称
示例如下:
1 list1=['雨霓同学',220,284,"亲和数对:1210&1184",['人生苦短,我用python']] 2 for index,item in enumerate(list1): 3 print(index+1,item) 4 输出: 5 1 雨霓同学 6 2 220 7 3 284 8 4 亲和数对:1210&1184 9 5 ['人生苦短,我用python']
3.2 添加、修改和删除列表元素
添加、修改和删除列表元素也称为更新列表。在实际开发时,经常需要对列表进行更新。
1.添加元素
在前面介绍过,通过“+”可以将两个序列连接,通过该方法也可以实现列表元素的添加。但是这种方法的执行速度要比直接使用列表对象的append()方法慢,所以一般使用append()方法在列表的末尾追加元素,其语法格式如下:
listname.append(obj)
listname: 要添加元素的列表名称
obj : 要添加到列表末尾的对象
示例如下:
list1=['雨霓同学',220,284,"亲和数对:1210&1184",['人生苦短,我用python']] list1.append("你猜猜这是啥") print(list1) 输出: ['雨霓同学', 220, 284, '亲和数对:1210&1184', ['人生苦短,我用python'], '你猜猜这是啥']
列表对象除了提供append()方法向列表中添加元素,还提供了insert()方法向列表中添加元素。该方法用于向列表的指定位置插入元素。但是该方法的执行效率没有append()方法高一般不建议使用,其语法格式如下:
listname.insert(index, obj) #其中index:为要插入位置的索引
此外,如果想要将一个列表中的全部元素添加到另一个列表中,可以使用列表对象的extend()方法,其语法格式如下:
listname.extend(seq)
listname:原列表,seq:要添加的列表。语句执行后,seq的内容将添加到listname的后面
有没有一种方法,将一个列表添加到另一个列表的任意位置。
2.修改元素
修改列表中的元素,只需要通过索引获得该元素,然后再为其重新赋值即可,示例如下:
1 list1=['雨霓同学',220,284,"亲和数对:1210&1184",['人生苦短,我用python']] 2 list1[2]=1210 3 print(list1) 4 输出: 5 ['雨霓同学', 220, 1210, '亲和数对:1210&1184', ['人生苦短,我用python']]
3.删除元素
删除元素主要有两种情况,一种是根据索引删除,一种是根据元素值删除。
根据索引删除:删除列表中的指定元素和删除列表类似,也可以使用del语句实现,所不同的是在指定列表名称时,换为列表元素。示例如下:
1 list1=['雨霓同学',220,284,"亲和数对:1210&1184",['人生苦短,我用python']] 2 del list1[-1] #删除最后一个元素 3 print(list1) 4 输出: 5 ['雨霓同学', 220, 284, '亲和数对:1210&1184']
使用pop()方法删除:pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值,语法格式如下:
list.pop([index=-1])
1 list1=[220,284,1210,1184,26,22,45] 2 list2=list1.pop(1) 3 print("删除的项为:",list2) 4 print("现在的列表为:",list1) 5 输出: 6 删除的项为: 284 7 现在的列表为: [220, 1210, 1184, 26, 22, 45]
根据元素值删除:想要删除一个不确定其位置的元素(根据元素值进行删除),可以使用列表对象的remove()方法实现,示例如下:
1 list1=['雨霓同学',220,284,"亲和数对:1210&1184",['人生苦短,我用python']] 2 list1.remove(284) #删除最后一个元素 3 print(list1) 4 输出: 5 ['雨霓同学', 220, '亲和数对:1210&1184', ['人生苦短,我用python']]
但是在使用remove()方法删除元素前,应该先判断元素是否存在,然后再进行删除,如果指定元素不存在,则会提示报错。
4.对列表元素进行统计计算
在Python列表中,提供了一些内置函数实现统计、计算等方面的功能。
4.1 获取指定元素出现的次数
使用列表对象的count()方法可以获取指定元素在列表中出现的次数,其基本语法格式如下:
listname.count(obj)
listname:表示列表的名称
obj:表示要判断是否存在的对象,这里只能进行精确匹配,即不能是元素值的一部分。
示例如下:
1 list1=['雨霓同学',220,284,220,284,"亲和数对:1210&1184",['人生苦短,我用python']] 2 num=list1.count(220) 3 print(num) 4 输出: 5 2
4.2获取指定元素首次出现的索引
使用列表对象的index()方法可以获取指定元素在列表中首次出现的位置(索引),基本语法格式:
listname.index(obj)
listname:列表的名称
obj:表示要查找的对象,只能进行精确匹配,如果指定对象不存在则会抛出异常。
示例如下:
1 list1=['雨霓同学',220,284,220,284,"亲和数对:1210&1184",['人生苦短,我用python']] 2 num=list1.index(220) 3 print(num) 4 输出: 5 1
4.3统计数值列表的元素和
在Python中,提供了sum()函数用于统计数值列表中各种元素的和,其语法格式如下:
sum(iterable [,start ])
interable:表示要统计的列表
start:表示统计结果是从哪个数开始(即将统计结果加上start所指定的数),可选参数,如果没有指定,默认值为0.
示例如下:
1 list1=[220,284,1210,1184,26,22,45] 2 total=sum(list1) 3 print(total) 4 输出: 5 2991
5.对列表进行排序
在Python中提供了两种常用的方法对列表进行排序:使用列表对象的sort()方法和使用内置的sorted()函数。
1.使用列表对象的sort()方法实现
列表对象提供了sort()方法用于对原列表中的元素进行排序。排序后原列表中的元素数学将发生改变,其语法格式如下:
listname.sort(key=none,reverse=False)
listname:表示要进行排序的列表
key:表示指定一个从每个列表元素中提取一个用于比较的键(例如:设置“key=str.lower”表示在排序时不区分大小写。)
reverse:可选参数,如果将其指定为True,则表示降序排序,如果为False,则表示升序排序,默认为升序排序。
示例如下:
1 list1=[220,284,1210,1184,26,22,45] 2 print("初始列表:",list1) #默认列表 3 list1.sort() 4 print("升序列表:",list1) #升序列表 5 list1.sort(reverse=True) 6 print("降序列表",list1) #降序列表 7 输出: 8 初始列表: [220, 284, 1210, 1184, 26, 22, 45] 9 升序列表: [22, 26, 45, 220, 284, 1184, 1210] 10 降序列表 [1210, 1184, 284, 220, 45, 26, 22]
此外在使用sort()方法对字符串列表进行排序,采用的规则是先对大写字母排序,然后在对小写字母排序。如果想要对字符串列表排序(不区分大小写),则需要指定Key参数。
示例如下:
1 listname=["pet",'Brother','Tom','Age','years','Bat'] 2 listname.sort() 3 print('区分大小写:',listname) 4 listname.sort(key=str.lower) 5 print('不区分大小写:',listname) 6 输出: 7 区分大小写: ['Age', 'Bat', 'Brother', 'Tom', 'pet', 'years'] 8 不区分大小写: ['Age', 'Bat', 'Brother', 'pet', 'Tom', 'years']
采用sort()方法对列表进行排序的时候,对中文支持很不友好,排序结果与常用的音序和笔画排序都不一样,如果需要实现对中文的排序,需要重新编写想要的方法进行处理,不能直接使用sort()方法。
2.使用内置的sorted()函数实现
在Python中,提供了一个内置的sorted()函数,用于对列表进行排序。使用该函数排序后,原列表的元素顺序不变,其语法格式如下:
sorted(interable,key=none,reverse=False)
inerable: 表示要进行排序的列表名称。
key:表示指定一个从每个列表中提取一个用于比较的键,
revese:可选参数,如果将其指定为True,则表示降序排列;如果为False表示升序排列。默认为升序排列。
示例如下:
1 list1=[220,284,1210,1184,26,22,45] 2 list2=sorted(list1) 3 print("升序:",list2) 4 list3=sorted(list1,reverse=True) 5 print('降序:',list3) 6 print('原序列',list1) 7 输出: 8 升序: [22, 26, 45, 220, 284, 1184, 1210] 9 降序: [1210, 1184, 284, 220, 45, 26, 22] 10 原序列 [220, 284, 1210, 1184, 26, 22, 45]
列表对象的sort()方法,在排序时会改变原列表的元素排列顺序,而使用sorted()函数时,会建立一个原列表的副本,改副本为排序后的列表。
6. 列表推导式
使用列表推导式可以快速生成一个列表,或者根据某个列表生成满足指定需求的列表,其常用语法格式如下:
1. 生成指定范围的数值列表
list = [expression for vat in range]
list: 表示要生成的列表名称
exprsessiom: 表达式,用于计算新列表的元素
var:循环变量
range: 采用range()函数生成的range对象
示例如下:
1 # 生成一个包括10个随机数的列表,范围在10~100之间 2 import random # 导入random(随机数) 3 random_numbers=[random.randint(10,100) for i in range(10)] 4 print("生成的随机数:",random_numbers) 5 输出: 6 生成的随机数: [60, 44, 72, 89, 81, 64, 75, 70, 77, 37]
2.根据列表生成指定需求的列表
newlist = [expressiom for var in list]
newlist: 表示新生成的列表名称
expression:表达式泳衣计算新列表元素
var: 变量,值为后面列表的每个元素值
list: 用于生成新列表的原列表
示例如下:
1 price=[220,284,1210,1184,26] 2 sale =[int(x*0.5) for x in price] 3 print("原始价格:",price) 4 print("打五折价格:",sale) 5 输出: 6 原始价格: [220, 284, 1210, 1184, 26] 7 打五折价格: [110, 142, 605, 592, 13]
3.从列表中选择符合条件的元素组成新的列表
newlist=[Expression for var in list if condition]
newlist:新生成列表的名称
Expression: 表达式,用于计算新列表的元素
var: 变量,值为后面列表的每个元素值。
list: 用于生成新列表的原始列表
condition: 条件表达式,用于指定筛选条件。
1 price=[220,284,1210,1184,26] 2 sale =[x for x in price if x > 256] 3 print("原始价格:",price) 4 print("价格高于256的:",sale) 5 输出: 6 原始价格: [220, 284, 1210, 1184, 26] 7 价格高于256的: [284, 1210, 1184]