1. 列表的创建和删除
Python中的列表和歌曲列表类似,也是由一系列按特定顺序排列的元素组成的。它是Python中内置的 可变序列。在形式上,列表的所有元素都放在一对中括号“[]”中,两个相邻元素间使用逗号“,”分隔。在内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入到列表中,并且同一个列表中,元素的类型可以不同,因为它们之间没有任何关系。
1.1 使用赋值运算符直接创建列表
同其他类型的Python变量一样,创建列表时,也可以使用赋值运算符“=”直接将一个列表赋值给变量,语法格式如下:
listname = [element 1,element 2,element 3,…,element n]
其中,listname表示列表的名称,可以是任何符合Python命名规则的标识符;“element 1,element 2, element 3,…,element n”表示列表中的元素,个数没有限制,并且只要是Python支持的数据类型就可以。
例如,下面定义的列表都是合法的:
num = [7,14,21,28,35,42,49,56,63]
verse = ["自古逢秋悲寂寥","我言秋日胜春朝","晴空一鹤排云上","便引诗情到碧霄"]
untitle = ['Python',28,"人生苦短,我用Python",["爬虫","自动化运维","云计算","Web开发"]]
python = ['优雅',"明确",'''简单''']
说明:在使用列表时,虽然可以将不同类型的数据放入到同一个列表中,但是通常情况下,我们不这样做,而是在一个列表中只放入一种类型的数据。这样可以提高程序的可读性。
1.2 创建空列表
在Python中,也可以创建空列表,例如,要创建一个名称为emptylist的空列表,可以使用下面的代码:
emptylist = []
1.3 创建数值列表
在Python中,数值列表很常用。例如,在考试系统中记录学生的成绩,或者在游戏中记录每个角色的位置、各个玩家的得分情况等都可应用数值列表。在Python中,可以使用list()函数直接将range()函数循环出来的结果转换为列表。
list()函数的基本语法如下:
list(data)
其中,data表示可以转换为列表的数据,其类型可以是range对象、字符串、元组或者其他可迭代类型的数据。
例如,创建一个10~20之间(不包括20)所有偶数的列表,可以使用下面的代码:
list(range(10, 20, 2))
运行上面的代码后,将得到下面的列表:
[10, 12, 14, 16, 18]
说明:使用 list() 函数不仅能通过range对象创建列表,还可以通过其他对象创建列表。
1.4 删除列表
对于已经创建的列表,不再使用时,可以使用del语句将其删除。语法格式如下:
del listname
其中,listname为要删除列表的名称。
说明:del语句在实际开发时,并不常用。因为Python自带的垃圾回收机制会自动销毁不用的列表,所以即使我们不手动将其删除,Python也会自动将其回收。
例如,定义一个名称为team的列表,然后再应用del语句将其删除,可以使用下面的代码:
team = ["皇马","罗马","利物浦","拜仁"]
del team
常见错误:在删除列表前,一定要保证输入的列表名称是已经存在的,否则将出现错误。
2. 访问列表元素
在Python中,如果想将列表的内容输出也比较简单,可以直接使用print()函数即可。例如,创建一个名称为untitle的列表,并打印该列表,可以使用下面的代码:
untitle = ['Python',28,"人生苦短,我用Python",["爬虫","自动化运维","云计算","Web开发"]]
print(untitle)
执行结果如下:
['Python', 28, '人生苦短,我用Python', ['爬虫', '自动化运维', '云计算', 'Web开发']]
从上面的执行结果中可以看出,在输出列表时,是包括左右两侧的中括号的。如果不想要输出全部的元素,也可以通过列表的索引获取指定的元素。例如,要获取untitle列表中索引为2的元素,可以使用下面的代码:
print(untitle[2])
执行结果如下:
人生苦短,我用Python
从上面的执行结果中可以看出,在输出单个列表元素时,不包括中括号,如果是字符串,还不包括左右的引号。
3. 遍历元素
遍历列表中的所有元素是常用的一种操作,在遍历的过程中可以完成查询、处理等功能。
3.1 直接使用for循环实现
直接使用for循环遍历列表,只能输出元素的值,语法格式如下:
for item in listname:
# 输出item
其中,item用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可;listname为列表名称。
例如,定义一个保存2017~2018赛季NBA西部联盟前八名的列表,然后通过for循环遍历该列表,并输出各个球队的名称,代码如下:
print("2017~2018赛季NBA西部联盟前八名:")
team = ["休斯顿 火箭","金州 勇士","波特兰 开拓者","犹他 爵士","新奥尔良 鹈鹕","圣安东尼奥 马刺","俄克拉荷马城 雷霆","明尼苏达 森林狼"]
for item in team:
print(item)
3.2 使用for循环和enumerate()函数实现
使用for循环和enumerate()函数可以实现同时输出索引值和元素内容,语法格式如下:
for index,item in enumerate(listname):
# 输出index和item
参数说明:
-
index:用于保存元素的索引。
-
item:用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可。
-
listname为列表名称。
例如,定义一个保存2017~2018赛季NBA西部联盟前八名的列表,然后通过for循环和enumerate()函数遍历该列表,并输出索引和球队名称,代码如下:
print("2017~2018赛季NBA西部联盟前八名:")
team = ["休斯顿 火箭","金州 勇士","波特兰 开拓者","犹他 爵士","新奥尔良 鹈鹕","圣安东尼奥 马刺","俄克拉荷马城 雷霆","明尼苏达 森林狼"]
for index,item in enumerate(team):
print(index + 1,item)
4. 添加、修改和删除列表元素
添加、修改和删除列表元素也称为更新列表。在实际开发时,经常需要对列表进行更新。
4.1 添加元素
可以通过“+”号将两个序列连接,通过该方法也可以实现为列表添加元素。但是这种方法的执行速度要比直接使用列表对象的append()方法慢,所以建议在实现添加元素时,使用列表对象的append()方法实现。列表对象的append()方法用于在列表的末尾追加元素,语法格式如下:
listname.append(obj)
其中,listname为要添加元素的列表名称,obj为要添加到列表末尾的对象。
例如,定义一个包括4个元素的列表,然后应用append()方法向该列表的末尾添加一个元素,可以使用下面的代码:
phone = ["摩托罗拉","诺基亚","三星","OPPO"]
len(phone) # 获取列表的长度
phone.append("iPhone")
len(phone) # 获取列表的长度
print(phone)
注意:列表对象除了提供append()方法可以向列表中添加元素,还提供了insert()方法也可以向列表中添加元素。该方法用于向列表的指定位置插入元素。但是由于该方法的执行效率没有append()方法高,所以不推荐这种方法。
如果想要将一个列表中的全部元素添加到另一个列表中,可以使用列表对象的extend()方法实现。extend()方法的语法如下:
listname.extend(seq)
其中,listname为原列表,seq为要添加的列表。语句执行后,seq的内容将追加到listname的后面。
4.2 修改元素
修改列表中的元素只需要通过索引获取该元素,然后再为其重新赋值即可。例如,定义一个保存3个元素的列表,然后修改索引值为2的元素,代码如下:
verse = ["长亭外","古道边","芳草碧连天"]
print(verse)
verse[2] = "一行白鹭上青天" # 修改列表的第3个元素
print(verse)
4.3 删除元素
删除元素主要有两种情况,一种是根据索引删除,另一种是根据元素值进行删除。
根据索引删除:
删除列表中的指定元素和删除列表类似,也可以使用del语句实现。所不同的就是在指定列表名称时,换为列表元素。例如,定义一个保存3个元素的列表,删除最后一个元素,可以使用下面的代码:
verse = ["长亭外","古道边","芳草碧连天"]
del verse[-1]
print(verse)
根据元素值删除:
如果想要删除一个不确定其位置的元素(即根据元素值删除),可以使用列表对象的remove()方法实现。例如,要删除列表中内容为“公牛”的元素,可以使用下面的代码:
team = ["火箭","勇士","开拓者","爵士","鹈鹕","马刺","雷霆","森林狼"]
team.remove("公牛")
使用列表对象的remove()方法删除元素时,如果指定的元素不存在,将会报错。所以在使用remove()方法删除元素前,最好先判断该元素是否存在,改进后的代码如下:
team = ["火箭","勇士","开拓者","爵士","鹈鹕","马刺","雷霆","森林狼"]
value = "公牛" # 指定要移除的元素
if team.count(value)>0: # 判断要删除的元素是否存在
team.remove(value) # 移除指定的元素
print(team)
说明:列表对象的count()方法用于判断指定元素出现的次数,返回结果为0时,表示不存在该元素。
5. 对列表进行统计和计算
Python的列表提供了内置的一些函数来实现统计、计算的功能。下面介绍几种常用的功能。
5.1 获取指定元素出现的次数
使用列表对象的count()方法可以获取指定元素在列表中的出现次数。基本语法格式如下:
listname.count(obj)
参数说明:
-
listname:表示列表的名称。
-
obj:表示要判断是否存在的对象,这里只能进行精确匹配,即不能是元素值的一部分。
-
返回值:元素在列表中出现的次数。
例如,创建一个列表,内容为听众点播的歌曲列表,然后应用列表对象的count()方法判断元素“云在飞”出现的次数,代码如下:
song = ["云在飞","我在诛仙逍遥涧","送你一匹马","半壶纱","云在飞","遇见你","等你等了那么久"]
num = song.count("云在飞")
print(num)
5.2 获取指定元素首次出现的下标
使用列表对象的index()方法可以获取指定元素在列表中首次出现的位置(即索引)。基本语法格式如下:
listname.index(obj)
参数说明:
-
listname:表示列表的名称。
-
obj:表示要查找的对象,这里只能进行精确匹配。如果指定的对象不存在时,则抛出如图14所示的异常。
-
返回值:首次出现的索引值。
例如,创建一个列表,内容为听众点播的歌曲列表,然后应用列表对象的index()方法判断元素“半壶纱”首次出现的位置,代码如下:
song = ["云在飞","我在诛仙逍遥涧","送你一匹马","半壶纱","云在飞","遇见你","等你等了那么久"]
position = song.index("半壶纱")
print(position)
说明:如果不存在就会报错。
5.3 统计数值列表的元素和
在Python中,提供了sum()函数用于统计数值列表中各元素的和。语法格式如下:
sum(iterable[,start])
参数说明:
-
iterable:表示要统计的列表。
-
start:表示统计结果是从哪个数开始(即将统计结果加上start所指定的数),是可选参数,如果没有指定,默认值为0。
例如,定义一个保存10名学生语文成绩的列表,然后应用sum()函数统计列表中元素的和,即统计总成绩,然后输出,代码如下:
grade = [98,99,97,100,100,96,94,89,95,100] # 10名学生的语文成绩列表
total = sum(grade) # 计算总成绩
print("语文总成绩为:",total)
6. 对列表进行排序
在实际开发时,经常需要对列表进行排序。Python中提供了两种常用的对列表进行排序的方法:使用列表对象的sort()方法,使用内置的sorted()函数。
6.1 使用列表对象的sort()方法
列表对象提供了sort()方法用于对原列表中的元素进行排序。排序后原列表中的元素顺序将发生改变。列表对象的sort()方法的语法格式如下:
listname.sort(key=None, reverse=False)
参数说明:
-
listname:表示要进行排序的列表。
-
key:表示指定从每个元素中提取一个用于比较的键(例如,设置“key=str.lower”表示在排序时不区分字母大小写)。
-
reverse:可选参数,如果将其值指定为True,则表示降序排列;如果为False,则表示升序排列,默认为升序排列。
例如,定义一个保存10名学生语文成绩的列表,然后应用sort()方法对其进行排序,代码如下:
grade = [98,99,97,100,100,96,94,89,95,100] # 10名学生语文成绩列表
print("原列表:",grade)
grade.sort() # 进行升序排列
print("升 序:",grade)
grade.sort(reverse=True) # 进行降序排列
print("降 序:",grade)
执行上面的代码,将显示以下内容:
原列表: [98, 99, 97, 100, 100, 96, 94, 89, 95, 100]
升 序: [89, 94, 95, 96, 97, 98, 99, 100, 100, 100]
降 序: [100, 100, 100, 99, 98, 97, 96, 95, 94, 89]
使用sort()方法进行数值列表的排序比较简单,但是使用sort()方法对字符串列表进行排序时,采用的规则是先对大写字母排序,然后再对小写字母排序。如果想要对字符串列表进行排序(不区分大小写时),需要指定其key参数。例如,定义一个保存英文字符串的列表,然后应用sort()方法对其进行升序排列,可以使用下面的代码:
char = ['cat','Tom','Angela','pet']
char.sort() # 默认区分字母大小写
print("区分字母大小写:",char)
char.sort(key=str.lower) # 不区分字母大小写
print("不区分字母大小写:",char)
运行上面的代码,将显示以下内容:
区分字母大小写: ['Angela', 'Tom', 'cat', 'pet']
不区分字母大小写: ['Angela', 'cat', 'pet', 'Tom']
说明:采用 sort() 方法对列表进行排序时,对中文支持不好。排序的结果与我们常用的音序排序法或者笔画排序法都不一致。如果需要实现对中文内容的列表排序,还需要重新编写相应的方法进行处理,不能直接使用sort()方法。
6.2 使用内置的sorted()函数实现
在Python中,提供了一个内置的sorted()函数,用于对列表进行排序。使用该函数进行排序后,原列表的元素顺序不变。sorted()函数的语法格式如下:
sorted(iterable, key=None, reverse=False)
参数说明:
-
iterable:表示要进行排序的列表名称。
-
key:表示指定从每个元素中提取一个用于比较的键(例如,设置“key=str.lower”表示在排序时不区分字母大小写)。
-
reverse:可选参数,如果将其值指定为True,则表示降序排列;如果为False,则表示升序排列,默认为升序排列。
例如,定义一个保存10名学生语文成绩的列表,然后应用sorted()函数对其进行排序,代码如下:
grade = [98,99,97,100,100,96,94,89,95,100] # 10名学生语文成绩列表
grade_as = sorted(grade) # 进行升序排列
print("升序:",grade_as)
grade_des = sorted(grade,reverse = True) # 进行降序排列
print("降序:",grade_des)
print("原序列:",grade)
执行上面的代码,将显示以下内容:
升序: [89, 94, 95, 96, 97, 98, 99, 100, 100, 100]
降序: [100, 100, 100, 99, 98, 97, 96, 95, 94, 89]
原序列: [98, 99, 97, 100, 100, 96, 94, 89, 95, 100]
说明:列表对象的 sort() 方法和内置 sorted() 函数的作用基本相同;不同点是在使用sort()方法时,会改变原列表的元素排列顺序,而使用 sorted() 函数时,会建立一个原列表的副本,该副本为排序后的列表。
7. 列表推导式
使用列表推导式可以快速生成一个列表,或者根据某个列表生成满足指定需求的列表。列表推导式通常有以下几种常用的语法格式。
(1)生成指定范围的数值列表,语法格式如下:
list = [Expression for var in range]
参数说明:
-
list:表示生成的列表名称。
-
Expression:表达式,用于计算新列表的元素。
-
var:循环变量。
-
range:采用range()函数生成的range对象。
例如,要生成一个包括10个随机数的列表,要求数的范围在10~100(包括)之间,具体代码如下:
import random # 导入random标准库
randomnumber = [random.randint(10,100) for i in range(10)]
print("生成的随机数为:",randomnumber)
执行结果如下:
生成的随机数为: [38, 12, 28, 26, 58, 67, 100, 41, 97, 15]
(2)根据列表生成指定需求的列表,语法格式如下:
newlist = [Expression for var in list]
参数说明:
-
newlist:表示新生成的列表名称。
-
Expression:表达式,用于计算新列表的元素。
-
var:变量,值为后面列表的每个元素值。
-
list:用于生成新列表的原列表。
例如,定义一个记录商品价格的列表,然后应用列表推导式生成一个将全部商品价格打五折的列表,具体代码如下:
price = [1200,5330,2988,6200,1998,8888]
sale = [int(x*0.5) for x in price]
print("原价格:",price)
print("打五折的价格:",sale)
执行结果如下:
原价格: [1200, 5330, 2988, 6200, 1998, 8888]
打五折的价格: [600, 2665, 1494, 3100, 999, 4444]
(3)从列表中选择符合条件的元素组成新的列表,语法格式如下:
newlist = [Expression for var in list if condition]
参数说明:
-
newlist:表示新生成的列表名称。
-
Expression:表达式,用于计算新列表的元素。
-
var:变量,值为后面列表的每个元素值。
-
list:用于生成新列表的原列表。
-
condition:条件表达式,用于指定筛选条件。
例如,定义一个记录商品价格的列表,然后应用列表推导式生成一个商品价格高于5000元的列表,具体代码如下:
price = [1200,5330,2988,6200,1998,8888]
sale = [x for x in price if x>5000]
print("原列表:",price)
print("价格高于5000的:",sale)
执行结果如下:
原列表: [1200, 5330, 2988, 6200, 1998, 8888]
价格高于5000的: [5330, 6200, 8888]
8. 二维列表的使用
在Python中,由于列表元素还可以是列表,所以它也支持二维列表的概念。
8.1 直接定义二维列表
在Python中,二维列表是包含列表的列表,即一个列表的每一个元素又都是一个列表。在创建二维列表时,可以直接使用下面的语法格式进行定义:
listname = [[元素11, 元素12, 元素13, …, 元素1n],
[元素21, 元素22, 元素23, …, 元素2n],
…,
[元素n1, 元素n2, 元素n3, …, 元素nn]]
参数说明:
-
listname:表示生成的列表名称。
-
[元素11, 元素12, 元素13, …, 元素1n]:表示二维列表的第一行,也是一个列表。其中“元素11,元素12,…元素1n”代表第一行中的列。
-
[元素21, 元素22, 元素23, …, 元素2n]:表示二维列表的第二行。
-
[元素n1, 元素n2, 元素n3, …, 元素nn]:表示二维列表的第n行。
例如,定义一个包含4行5列的二维列表,可以使用下面的代码:
verse = [['千', '山', '鸟', '飞', '绝'], ['万', '径', '人', '踪', '灭'],['孤', '舟', '蓑', '笠', '翁'], ['独', '钓', '寒', '江', '雪']]
8.2 使用嵌套的for循环创建
创建二维列表,可以使用嵌套的for循环实现。例如,创建一个包含4行5列的二维列表,可以使用下面的代码:
arr = [] # 创建一个空列表
for i in range(4):
arr.append([]) # 在空列表中再添加一个空列表
for j in range(5):
arr[i].append(j) # 为内层列表添加元素
上面代码在执行后,将创建以下二维列表:
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
8.3 使用列表推导式创建
使用列表推导式也可以创建二维列表,因为这种方法比较简洁,所以建议使用这种方法创建二维列表。例如,使用列表推导式创建一个包含4行5列的二维列表可以使用下面的代码:
arr = [[j for j in range(5)] for i in range(4)]
上面代码在执行后,将创建以下二维列表:
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
创建二维数组后,可以通过以下语法格式访问列表中的元素:
listname[下标1][下标2]
参数说明:
-
listname:列表名称。
-
下标1:表示列表中第几行,下标值从0开始,即第一行的下标为0。
-
下标2:表示列表中第几列,下标值从0开始,即第一列的下标为0。
例如,要访问二维列表中的第2行,第4列,可以使用下面的代码:
verse[1][3]
说明:list() 函数用于将字符串转换为列表;列表对象的 reverse() 方法用于对列表进行逆序排列,即将列表的最后一个元素移到第一个,倒数第二个元素移到第二个,以此类推。