3.3 列表与元组
列表是Python中内置的可变序列,由一系列按特定顺序排列的元素组成。列表的所有元素都放在一对中括号“[ ]”中,相邻元素间使用英文逗号“,”分隔。整数、实数、字符串、列表、元组等任何类型的内容都可以放入列表中,且同一个列表中元素的类型可以不同,因为它们之间没有任何关系。由此可见,Python中的列表是非常灵活的,这一点与其他语言是不同的。
3.3.1 列表的创建
在Python中提供了多种创建列表的方法,下面分别进行介绍。
1.使用赋值运算符直接创建列表
创建列表时,也可以使用赋值运算符“=”直接将一个列表赋值给变量。语法格式如下:
listname = [element 1,element 2,…,element n]
参数说明:
listname:列表名称,可以是任何符合Python命名规则的标识符。
elemnet 1,elemnet 2,…,elemnet n:列表中的元素,个数没有限制,只要是Python支持的数据类型就可以。
例如,下面定义的都是合法的列表。
01 num = [7,14,21,28,35,42,49,56,63] 02 verse = ["自古逢秋悲寂寥","我言秋日胜春朝","晴空一鹤排云上","便引诗情到碧霄"] 03 untitle = ['Python',28,"人生苦短,我用Python",["爬虫","自动化运维","云计算","Web开发"]] 04 python = ['优雅',"明确",'''简单''']
说明
虽然可以将不同类型的数据放在同一个列表中,但通常情况下不这样做。建议大家一个列表只放入一种类型的数据,这样可以提高程序的可读性。
2.创建空列表
在Python中可以创建空列表。例如,创建一个名称为emptylist的空列表,代码如下:
emptylist = []
3.创建数值列表
数值列表很常见,创建数值列表需要使用list()函数。例如,在考试系统中记录学生的成绩,或者在游戏中记录每个角色的位置、各个玩家的得分等,都可以应用数值列表来保存对应的数据。
list()函数的基本语法格式如下:
list(data)
其中,data是可以转换为列表的数据,类型可以是range对象、字符串、元组或其他可迭代类型。
例如,创建一个10~20(不包括20)范围所有偶数的列表,可以使用下面的代码:
list(range(10, 20, 2)) #10~20(不包括20)范围所有偶数的列表
运行上面的代码后,将得到下面的列表:
[10, 12, 14, 16, 18]
说明
使用list()函数不仅能通过range对象创建列表,还可以通过其他对象创建列表。
3.3.2 检测列表元素
在Python中,可以直接使用print()函数输出列表的内容。例如,要打印上面创建的untitle列表,可以使用下面的代码:
print(untitle)
运行结果如下:
['Python', 28, '人生苦短,我用Python', ['爬虫', '自动化运维', '云计算', 'Web开发', '游戏']]
可以看出,输出列表时会包括左右两侧的中括号。如果不想输出全部元素,可通过列表索引获取指定的元素。例如,要获取列表untitle中索引为2的元素,可以使用下面的代码:
print(untitle[2])
运行结果如下:
人生苦短,我用Python
从上面的运行结果中可以看出,输出单个列表元素时,不包括中括号;如果是字符串,不包括左右的引号。
3.3.3 列表的截取—切片
列表的截取就是切片操作,它可以访问一定范围内的元素,并通过切片操作生成一个新的序列。实现切片操作的语法格式如下:
sname[start : end : step]
参数说明:
sname:序列的名称。
start:切片的开始位置(包括该位置)。如果不指定,则默认为0。
end:切片的截止位置(不包括该位置)。如果不指定,则默认为序列的长度。
step:切片的步长。如果省略,则默认为1。当省略该步长时,最后一个冒号也要省略。
说明
进行切片操作时,如果指定了步长,将按照该步长遍历序列中的元素,否则将逐个元素地遍历序列。
例如,通过切片获取热门综艺名称列表中的第2~5个元素,以及获取第1个、第3个和第5个元素,可以使用下面的代码。
运行上面的代码,将输出以下内容:
['歌手', '中国好声音', '巧手神探', '欢乐喜剧人'] ['向往的生活', '中国好声音', '欢乐喜剧人']
说明
要想复制整个序列,可以将start和end参数都省略,但中间的冒号需要保留。例如,verse[:]表示复制verse列表中的整个序列。
3.3.4 列表的拼接
在Python中,支持两种相同类型列表的相加操作。这里,“相加”的含义是将两个列表拼接起来,使用加号运算符“+”来实现。例如,将两个列表相加,可以使用下面的代码。
运行上面的代码,将输出以下内容:
['快乐大本营', '天天向上', '中餐厅', '跨界喜剧王', '向往的生活', '歌手', '中国好声音', '巧手神探', '欢乐喜剧人', '笑傲 江湖', '奔跑吧', '王牌对王牌', '吐槽大会', '奇葩说']
从输出结果可以看出,两个列表被合并为一个列表了。
说明
进行序列相加时,相同类型的序列是指同为列表、元组、集合等,序列中的元素类型可以不同。例如,下面的代码也是正确的:
01 num = [7,14,21,28,35,42,49,56] 02 art = ["快乐大本营","天天向上","中餐厅","跨界喜剧王"] 03 print(num + art)
相加后的结果如下:
[7, 14, 21, 28, 35, 42, 49, 56, '快乐大本营', '天天向上', '中餐厅', '跨界喜剧王']
但不能是列表和元组相加,或者列表和字符串相加。例如,下面的代码就是错误的:
01 num = [7,14,21,28,35,42,49,56,63] 02 print(num + "输出是7的倍数的数")
上面的代码运行后将产生如图3.42所示的异常信息。
图3.42 将列表和字符串相加产生的异常信息
3.3.5 遍历列表
有时候,我们需要遍历列表中的所有元素,以实现查询、修改、删除等功能。在Python中遍历列表的方法有多种,下面介绍两种常用的方法。
1.使用for循环遍历列表
直接使用for循环遍历列表,并输出元素的值,语法格式如下:
参数说明:
item:用于保存获取到的元素值。输出元素内容时,直接输出该变量即可。
listname:列表的名称。
【实例3.16】 输出热门综艺的名称。(实例位置:资源包\Code\03\16)
定义一个保存热门综艺名称的列表,然后通过for循环遍历该列表,并输出各综艺的名称。具体代码如下:
运行上面的代码,结果如图3.43所示。
2.使用for循环和enumerate()函数遍历列表
使用for循环和enumerate()函数遍历列表,可以同时输出索引值和对应的元素内容。语法格式如下:
for index,item in enumerate(listname): #遍历列表listname的每一项 print(index,item) #输出index和item
参数说明:
index:用于保存元素的索引。
item:用于保存获取到的元素值。输出元素内容时,直接输出该变量即可。
listname:列表的名称。
例如,定义一个保存热门综艺名称的列表,然后通过for循环和enumerate()函数遍历该列表,并输出索引和综艺名称,代码如下:
执行上面的代码,将显示下面的结果。
热门综艺名称: 1 向往的生活 2 歌手 3 中国好声音 4 巧手神探 5 欢乐喜剧人 6 笑傲江湖 7 奔跑吧 8 王牌对王牌 9 吐槽大会 10 奇葩说
如果想实现分两列(两个综艺一行)输出热门综艺名称,请看下面的实例。
【实例3.17】 分两列输出热门综艺名称。(实例位置:资源包\Code\03\17)
创建一个文件,在该文件中先输出标题,然后定义一个列表(保存综艺名称),再应用for循环和enumerate()函数遍历列表,在循环体中通过if…else语句判断是否为偶数,如果为偶数则不换行输出,否则换行输出。具体代码如下:
说明
上面的代码中,print()函数中使用“, end=''”表示不换行输出,即下一条print()函数的输出内容会和这条内容在同一行输出。
运行结果如图3.44所示。
图3.43 通过for循环遍历列表
图3.44 分两列显示热门综艺名称
3.3.6 列表排序
在实际开发时,经常需要对列表进行排序。Python中提供了两种常用的列表排序方法,下面分别进行介绍。
1.使用列表对象的sort()方法排序
使用列表对象的sort()方法,可对列表中的元素进行排序。排序后,原列表中的元素顺序将发生改变。sort()方法的语法格式如下:
listname.sort(key=None, reverse=False)
参数说明:
listname:要进行排序的列表。
key:在指定列表中选择一个用于比较的键。如果设置“key=str.lower”,表示在排序时不区分字母大小写。
reverse:可选参数。其值为True,表示降序排列;为False,则表示升序排列。默认为升序排列。
例如,定义一个保存10名学生语文成绩的列表,然后应用sort()方法对其进行排序,代码如下:
执行上面的代码,将显示以下内容。
原列表: [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()方法对数值列表进行排序比较简单,但在对字符串列表进行排序时,采用的规则是先对大写字母进行排序,然后再对小写字母进行排序。如果不需要区分大小写字母,需要指定参数key。例如,定义一个保存英文字符串的列表,然后应用sort()方法对其进行升序排列,可以使用下面的代码。
运行上面的代码,将显示以下内容。
区分字母大小写: ['Angela', 'Tom', 'cat', 'pet'] 不区分字母大小写: ['Angela', 'cat', 'pet', 'Tom']
说明
sort()排序方法对于中文的支持不够友好,排序的结果与我们常用的按拼音或者按笔画排序都不一致。如果需要对中文内容的列表排序,还需要重新编写排序方法,不能直接使用sort()方法。
2.使用内置的sorted()函数排序
使用内置的sorted()函数,也可以对列表进行排序。storted()函数的语法格式如下:
sorted(iterable, key=None, reverse=False)
参数说明:
iterable:要进行排序的列表名称。
key:在指定列表中选择一个用于比较的键。如果设置“key=str.lower”,表示在排序时不区分字母大小写。
reverse:可选参数。其值为True,表示降序排列;为False,则表示升序排列。默认为升序排列。
例如,定义一个保存10名学生语文成绩的列表,然后应用sorted()函数对其进行排序,代码如下:
执行上面的代码,将显示以下内容。
升序: [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()方法时,会改变原列表的元素排列顺序;使用storted()函数时,会建立一个原列表的副本,该副本为排序后的列表。
3.3.7 元组
元组(tuple)是Python中另一个重要的序列结构。与列表类似,元组也由一系列按特定顺序排列的元素组成,但却是不可变序列。因此,元组也可以称为不可变的列表。
形式上,元组的所有元素都放在一对小括号“()”中,相邻元素间使用英文逗号“,”分隔。内容上,可以将整数、实数、字符串、列表、元组等任何类型的内容放入元组中,且同一个元组中元素的类型可以不同。通常情况下,元组用于保存程序中不可修改的内容。
1.元组的创建
在Python中提供了多种创建元组的方法,下面分别进行介绍。
1)使用赋值运算符直接创建元组
创建元组时,可以使用赋值运算符“=”直接将一个元组赋值给变量。语法格式如下:
tuplename = (element 1,element 2,…,element n)
参数说明:
tuplename:元组的名称,可以是任何符合Python命名规则的标识符。
elemnet 1,elemnet 2,…,elemnet n:元组中的元素,个数没有限制,只要是Python支持的数据类型就可以。
说明
元组的创建格式与列表类似,只是创建列表使用的是中括号“[]”,而创建元组使用的是小括号“()”。
例如,下面定义的都是合法的元组。
num = (7,14,21,28,35,42,49,56,63) ukguzheng = ("渔舟唱晚","高山流水","出水莲","汉宫秋月") untitle = ('Python',28,("人生苦短","我用Python"),["爬虫","自动化运维","云计算","Web开发"]) python = ('优雅',"明确",'''简单''')
在Python中,虽然元组的标准格式是使用一对小括号将所有的元素括起来,但是实际上,小括号并不是必须的。只要将一组值用逗号分隔开来,就可以认为它是元组。例如,下面的代码定义的也是元组。
ukguzheng = "渔舟唱晚","高山流水","出水莲","汉宫秋月"
在IDLE中输出该元组后,将显示以下内容。
('渔舟唱晚', '高山流水', '出水莲', '汉宫秋月')
如果要创建的元组中只包括一个元素,则需要在定义元组时在元素的后面加一个逗号“,”。例如,下面的代码定义的就是包括一个元素的元组。
verse = ("一片冰心在玉壶",)
在IDLE中输出verse,将显示以下内容:
('一片冰心在玉壶',)
而下面的代码,则表示定义一个字符串:
verse = ("一片冰心在玉壶")
在IDLE中输出verse,将显示以下内容:
一片冰心在玉壶
说明
在Python中,可以使用type()函数测试变量的类型。例如,有下面的代码:
01 verse1 = ("一片冰心在玉壶",) 02 print("verse1的类型为",type(verse1)) 03 verse2 = ("一片冰心在玉壶") 04 print("verse2的类型为",type(verse2))
在IDLE中执行上面的代码,将显示以下内容。
verse1的类型为 <class 'tuple'> verse2的类型为 <class 'str'>
2)创建空元组
在Python中,也可以创建空元组,例如,要创建一个名称为emptytuple的空元组,代码如下:
emptytuple = ()
空元组可以应用在为函数传递一个空值或者返回空值时。例如,定义一个函数必须传递一个元组类型的值,而我们还不想为它传递一组数据,就可以创建一个空元组并传递给它。
3)创建数值元组
可以使用tuple()函数将一组数据转换为元组,基本语法如下:
tuple(data)
其中,data表示可以转换为元组的数据,其类型可以是range对象、字符串、元组或者其他可迭代类型的数据。
例如,创建一个10~20(不包括20)范围所有偶数的元组,可以使用下面的代码:
tuple(range(10, 20, 2))
运行上面的代码后,将得到下面的元组:
(10, 12, 14, 16, 18)
说明
使用tuple()函数不仅能通过range对象创建元组,还可以通过其他对象创建元组。
2.访问元组元素
在Python中,可以直接使用print()函数输出元组的内容。例如,要想打印前面创建的untitle元组,可以使用下面的代码:
print(untitle)
执行结果如下:
('Python', 28, ('人生苦短', '我用Python'), ['爬虫', '自动化运维', '云计算', 'Web开发'])
从执行结果可以看出,输出元组时包括左右两侧的小括号。如果不想输出全部的元素,可通过元组索引来获取指定的元素。例如,要获取元组untitle中索引为0的元素,可以使用下面的代码:
print(untitle[0])
执行结果如下:
Python
从执行结果可以看出,输出单个元组元素时不包括小括号;如果是字符串,不包括左右的引号。
另外,对于元组也可以采用切片方式获取指定的元素。例如,要访问元组untitle中前3个元素,可以使用下面的代码:
print(untitle[:3])
执行结果如下:
('Python', 28, ('人生苦短', '我用Python'))
同列表一样,元组也可以使用for循环进行遍历,方法不再赘述。