Python中的列表是由一系列按特定顺序排列的元素组成的,是Python中内置的可变序列。在形式上,列表的所有元素都放在一对方括号([ ])中,两个相邻元素间使用逗号(,)分隔。在内容上,可以将整数、浮点数、字符串、列表、元组等任何类型的内容放入列表中,并且同一个列表中元素的类型可以不同,因为它们之间没有任何关系。
在Python中提供了多种创建列表的方法,下面进行详细介绍。
同其他类型的Python变量一样,创建列表时也可以使用赋值运算符(=)直接将一个列表赋值给变量,语法格式如下:
listname=[element1,element2,element3,…,elementn]
参数说明:
● listname:表示列表的名称,可以是任何符合Python命名规则的标识符。
● element1,elemnet2,elemnet3,…,elemnetn:表示列表中的元素,元素个数没有限制,并且只要是Python支持的数据类型就可以。
例如,下面定义的列表都是合法的:
num = [7,14,21,28,35,42,49,56,63] verse = ["自古逢秋悲寂寥","我言秋日胜春朝","晴空一鹤排云上","便引诗情到碧霄"] untitle = ['Python',28,"人生苦短,我用Python",["爬虫","自动化运维","云计算","Web开发"]] python = ['优雅',"明确","简单"]
在Python中也可以创建空列表。例如,要创建一个名称为emptylist的空列表,可以使用下面的代码:
emptylist = []
在Python中,数值列表是很常用的,可以使用list()函数直接将range()函数循环出来的结果转换为列表。
list()函数的语法格式如下:
list(data)
参数说明:
● data表示可以转换为列表的数据,其类型可以是range对象、字符串、元组或者其他可迭代类型的数据。
【例3.7】创建一个10~20(不包括20)所有偶数的列表。
list(range(10,20,2))
运行上面的代码后,将得到下面的列表:
[10,12,14,16,18]
使用list()函数不仅能通过range对象创建列表,还可以通过其他对象创建列表。
对于已经创建的列表,当它不再被使用时,可以使用del语句删除。语法格式如下:
del listname
参数说明:
● listname:表示要删除的列表的名称。
【例3.8】定义一个名称为team的列表,然后应用del语句将其删除。
team=["皇马","罗马","利物浦","拜仁"] delteam
在Python中,如果想输出列表的内容也是比较简单的,直接使用print()函数即可。
【例3.9】创建一个名称为untitle的列表,并打印该列表。
untitle=['Python',28,"人生苦短,我用Python",["爬虫","自动化运维","云计算","web 开发"]] print(untitle)
执行结果如下:
['Python',28,'人生苦短,我用Python',['爬虫','自动化运维','云计算','Web开发',' 游戏']]
从上面的执行结果中可以看出,在输出列表时是包括方括号的。
如果不想要输出全部的元素,也可以通过列表的索引获取指定的元素。
【例3.10】要获取untitle列表中索引为2的元素。
print(untitle[2])
执行结果如下:
人生苦短,我用Python
从执行结果中可以看出,在输出单个列表元素时,不包括方括号,如果是字符串,还将不包括引号。
遍历列表中的所有元素是常用的一种操作,在遍历的过程中可以完成查询、处理等功能。在Python中遍历列表的方法有很多种,下面介绍常用的两种方法。
直接使用for循环遍历列表,只能输出元素的值,其语法格式如下:
for item in listname:
参数说明:
● item:用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可。
● listname:表示列表名称。
【例3.11】定义一个保存2017—2018赛季NBA西部联盟前八名的列表,然后通过for循环遍历该列表,并输出各个球队的名称。
print("2017~2018赛季NBA西部联盟前八名:") team = ["休斯敦火箭", "金州勇士", "波特兰开拓者", "犹他爵士", "新奥尔良鹈鹕", "圣安东 尼奥马刺", "俄克拉何马城雷霆", "明尼苏达森林狼"] for item in team: print(item)
执行上面的代码,结果如图3.1所示。
图3.1 通过for循环遍历列表
使用for循环和enumerate()函数可以同时输出索引值和元素内容,其语法格式如下:
for index,item in enumerate(listname):
参数说明:
● index:用于保存元素的索引。
● item:用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可。
● listname:表示列表名称。
【例3.12】定义一个保存2017—2018赛季NBA西部联盟前八名的列表,然后通过for循环和enumerate()函数遍历该列表,并输出索引和球队名称。
print("2017—2018赛季NBA西部联盟前八名:") team = ["休斯敦火箭", "金州勇士", "波特兰开拓者", "犹他爵士", "新奥尔良鹈鹕", "圣安东 尼奥马刺", "俄克拉何马城雷霆", "明尼苏达森林狼"] for index, item in enumerate(team): print(index + 1, item)
执行上面的代码,结果如图3.2所示。
图3.2 通过for循环和enumerate9()函数
添加、修改和删除列表元素也称为更新列表。在实际开发时,经常需要对列表进行更新。下面我们介绍如何实现列表元素的添加、修改和删除。
在3.1.3节介绍了可以通过“+”号连接两个序列,通过该方法也可以实现为列表添加元素。但是这种方法的执行速度要比直接使用列表对象的append()方法慢,所以建议在添加元素时,使用列表对象的append()方法实现。列表对象的append()方法用于在列表的末尾追加元素,其语法格式如下:
listname.append(obj)
参数说明:
● listname:为要添加元素的列表名称。
● obj:为要添加到列表末尾的对象。
【例3.13】定义一个包括4个元素的列表,然后应用append()方法向该列表的末尾添加一个元素。
phone = ["摩托罗拉", "诺基亚", "三星", "OPPO"] len(phone) # 获取列表的长度 phone.append("iPhone") len(phone) # 获取列表的长度 print(phone)
上面代码的运行结果如图3.3所示。
图3.3 append()方法的使用
修改列表中的元素只需要通过索引获取该元素,然后为其重新赋值即可。
【例3.14】定义一个保存3个元素的列表,然后修改索引值为2的元素。
verse = ["长亭外","古道边","芳草碧连天"] print(verse) verse[2] = "一行白鹭上青天" #修改列表的第3个元素 print(verse)
上述代码的运行结果如下:
['长亭外', '古道边', '芳草碧连天'] ['长亭外', '古道边', '一行白鹭上青天']
删除元素主要有两种方法,一种是根据索引进行删除,另一种是根据元素值进行删除。
● 根据索引进行删除
删除列表中的指定元素和删除列表类似,也可以使用del语句实现,所不同的就是在指定列表名称时换为列表元素。
【例3.15】定义一个保存3个元素的列表,删除最后一个元素。
verse = ["长亭外","古道边","芳草碧连天"] del verse[-1] print(verse)
上述代码的运行结果如下:
["长亭外","古道边"]
● 根据元素值进行删除
如果想要删除一个不确定其位置的元素(即根据元素值删除),可以使用列表对象的remove()方法实现。
【例3.16】要删除列表中内容为“公牛”的元素。
team=["火箭","勇士","开拓者","爵士","鹈鹕","马刺","雷霆","森林狼"] team.remove("公牛")
在使用remove()方法删除元素前,最好先判断该元素是否存在,改进后的代码如下:
team = ["火箭","勇士","开拓者","爵士","鹈鹕","马刺","雷霆","森林狼"] value = "金牛" # 指定要移除的元素 if team.count(value) > 0:# 判断要删除的元素是否存在 team.remove(value) # 移除指定的元素 print(team)
列表对象的count()方法用于判断指定元素出现的次数,返回结果为0时,表示不存在该元素。关于count()方法的详细介绍请参见3.2.5节。
执行上面的代码后,得到的结果如下:
['火箭','勇士','开拓者','爵士','鸦鹕','马刺','雷霆','森林狼']
Python的列表提供了内置的一些函数来实现统计、计算的功能。下面介绍几种常用的统计计算功能。
使用列表对象的count()方法可以获取指定元素在列表中的出现次数,其语法格式如下:
listname.count(obj)
参数说明:
● listname:表示列表的名称。
● obj:表示要判断是否存在的对象,这里只能进行精确匹配,即不能是元素值的一部分。
【例3.17】创建一个列表,内容为听众点播的歌曲名称,然后应用列表对象的count()方法统计元素“云在飞”出现的次数。
song = ["云在飞","我在诛仙道遥洞","送你一匹马","半壶纱","云在飞","遇见你","等你等 了那么久"] num = song.count("云在飞") print(num)
上面的代码运行后,结果将显示为2,表示“云在飞”在song列表中出现了两次。
使用列表对象的index()方法可以获取指定元素在列表中首次出现的位置(即索引),其语法格式如下:
listname.index(obj)
参数说明:
● listname:表示列表的名称。
● obj:表示要查找的对象,这里只能进行精确匹配。如果指定的对象不存在,则抛出异常。
【例3.18】获取指定元素首次出现的位置。
aList = [123, 'xyz', 'runoob', 'abc'] print "xyz 索引位置: ", aList.index( 'xyz' ) print "runoob 索引位置 : ", aList.index( 'runoob', 1, 3 )
运行上面的代码,输出结果如下:
xyz 索引位置: 1 runoob 索引位置 : 2
在Python中,提供了sum()函数用于统计数值列表中各元素的和,其语法格式如下:
sum(iterable[,start])
参数说明:
● iterable:表示要统计的列表。
● start:表示统计结果是从哪个数开始(即将统计结果加上start所指定的数),是可选参数,如果没有指定,默认值为0。
【例3.19】统计数值列表的元素。
>>>sum([0,1,2]) 3 >>> sum((2, 3, 4), 1) # 元组计算总和后再加 1 10 >>> sum([0,1,2,3,4], 2) # 列表计算总和后再加 2 12
在Python中,提供了两种常用的对列表进行排序的方法:使用列表对象的sort()方法和使用内置的sorted()函数。
列表对象提供了sort()方法用于对原列表中的元素进行排序,排序后原列表中的元素顺序将发生改变。列表对象的sort()方法的语法格式如下:
listname.sort(key=None,reverse=False)
参数说明:
● listname:表示要进行排序的列表。
● key:表示指定从每个元素中提取一个用于比较的键(例如,设置“key=str.lower”表示在排序时不区分字母大小写)。
● reverse:可选参数。如果将其值指定为True,则表示降序排列;如果为False,则表示升序排列。默认为升序排列。
使用sort()方法进行数值列表的排序是比较简单的,直接比较数值大小即可。但是使用sort()方法对字符串列表进行排序时则稍显复杂,采用的规则是先对大写字母排序,然后对小写字母排序。如果想要在对字符串列表进行排序时不区分大小写,需要指定其key参数。
【例3.20】定义一个保存英文字符串的列表,然后应用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']
在Python中,提供了一个内置的sorted()函数用于对列表进行排序,使用该函数进行排序后原列表的元素顺序不变。storted()函数的语法格式如下:
sorted(iterable,key=None,reverse=False)
参数说明:
● iterable:表示要进行排序的列表名称。
● key:表示指定从每个元素中提取一个用于比较的键(例如,设置“key=str.lower”表示在排序时不区分字母大小写)。
● reverse:可选参数。如果将其值指定为True,则表示降序排列;如果为False,则表示升序排列。默认为升序排列。
【例3.21】定义一个保存10名学生语文成绩的列表,然后应用sorted()函数对其进行排序。
grade = [98, 99, 97, 100, 100, 96, 97, 89, 95, 100] # 10名学生语文成绩列表 grade_as = sorted(grade) # 进行升序排列 print("升序", grade_as) grade_des = sorted(grade, reverse=True) # 进行降序排列 print("降序", grade_des) print("原序列", grade)
执行上面的代码,得到的结果如下:
升序 [89, 95, 96, 97, 97, 98, 99, 100, 100, 100] 降序 [100, 100, 100, 99, 98, 97, 97, 96, 95, 89] 原序列 [98, 99, 97, 100, 100, 96, 97, 89, 95, 100]
列表对象的sort()方法和内置sorted()函数的作用基本相同,不同点是在使用sort()方法时会改变原列表的元素排列顺序,而使用storted()函数时会建立一个原列表的副本,该副本为排序后的列表。
使用列表推导式可以快速生成一个列表,或者根据某个列表生成满足指定需求的列表。列表推导式通常有以下几种常用的语法格式。
(1)生成指定范围的数值列表,语法格式如下:
list=[Expression for var in range]
参数说明:
● list:表示生成的列表名称。
● Expression:表达式,用于计算新列表的元素。
● var:循环变量。
● range:采用range()函数生成的range对象。
【例3.22】要生成一个包括10个随机数的列表,要求数值范围为10~100(包括10和100)。
import random # 导入random标准库 randomnumber=[random.randint(10,100) for i in range(10)] print("生成的随机数为:",randomnumber)
执行结果如下:
生成的随机数为: [16, 50, 20, 32, 49, 21, 26, 37, 84, 22]
(2)生成指定需求的列表,语法格式如下:
newlist=[Expression for var in list]
参数说明:
● newlist:表示新生成的列表名称。
● Expression:表达式,用于计算新列表的元素。
● var:变量,值为list中的每个元素值。
● list:用于生成新列表的原列表。
【例3.23】定义一个记录商品价格的列表,然后应用列表推导式生成一个将全部商品价格打五折的列表。
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:条件表达式,用于指定筛选条件。
【例3.24】定义一个记录商品价格的列表,然后应用列表推导式生成一个商品价格高于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 价格高于5000的: [5330, 6200, 8888]
在Python中,由于列表元素还可以是列表,所以它也支持二维列表的概念。二维列表中的信息以行和列的形式表示,第一个下标代表元素所在的行,第二个下标代表元素所在的列。在Python中,创建二维列表有以下3种常用的方法。
在Python中,二维列表是包含列表的列表,即一个列表的每一个元素又都是一个列表。在创建二维列表时,可以直接使用下面的语法格式进行定义:
listname=[[元素11,元素12,元素13,…,元素1n], [元素21,元素22,元素23,…,元素2n],***) **** [元素n1,元素n2,元素n3,…,元素nn]]
参数说明:
● listname:表示生成的列表名称。
● [元素11,元素12,元素13,…,元素In]:表示二维列表的第一行,也是一个列表。其中“元素11,元素12,…,元素In”代表第一行中的列。
● [元素21,元素22,元素23,…,元素2n]:表示二维列表的第二行。
● [元素nl,元素n2,元素n3,…,元素nn]:表示二维列表的第n行。
【例3.25】定义一个二维列表。
test = [0, 0, 0], [0, 0, 0], [0, 0, 0]]
创建二维列表,可以使用嵌套的for循环实现。
【例3.26】创建一个包含4行5列的二维列表。
arr = [] # 创建一个空列表 for i in range(4): # 循环4次,i的取值范围为0到3 arr.append([]) # 在arr中添加一个空列表 for j in range(5): # 循环5次,j的取值范围为0到4 arr[i].append(j) # 将j的值添加到arr的第i个列表中
使用列表推导式也可以创建二维列表,因为这种方法比较简洁,所以建议使用这种方法创建二维列表。
【例3.27】使用列表推导式创建一个包含4行5列的二维列表。
arr= [[j for j in range(5)] for i in range(4)]
创建二维列表后,可以通过以下语法格式访问列表中的元素:
listname[下标1][下标2]
参数说明:
● listname:列表名称。
● 下标1:表示列表中第几行,下标值从0开始,即第一行的下标为0。
● 下标2:表示列表中第几列,下标值从0开始,即第一列的下标为0。
【例3.28】访问二维列表中的第2行、第4列。
verse[1][3]