第5 章列表与元组 5.1 本章语法 1.列表赋值与输入输出 列表是将一组数据放在一对方括号([])中,以逗号分隔,即定义一个列表: ls1 = ['physics', 'chemistry', 1997, 2000] ls2 = [1, 2, 3, 4, 5 ] ls3 = ["a", "b", "c", "d"] 列表中每个数据称为“元素”,数据的个数称为“长度”。不包含任何元素的列表称为 空列表,即[]。列表的元素可以是相同类型,也可以是不同的类型。 列表的输入和输出最简单的方式是: . 输入:采用列表=input(),从键盘输入的是方括号([])括起来的列表,元素以逗 号分隔,如图5.1所示。 . 输出:采用print列表,输出完整的列表,即方括号([])括起来的列表,元素以逗 号+空格作分隔,如图5.1所示。 图5.1 列表的整体输入输出界面 列表输入和输出比较复杂的方式是: . 输入:使用raw_input函数以字符串形式接受数据,然后利用map函数和字符串 的split方法将其转换为数值型列表,此时输入时不带方括号,以逗号或空格进行 Python 程序设计学习辅导 分隔的多个数,详细用法参见例5.1的方法2和方法3。 . 输出:列表的输出通过遍历方式,这与字符串遍历输出一样,可以用两种方式,详 细用法参见例5.1的方法4和方法5。 2.列表操作 列表元素有序存放,列表的序号也分为正向序号和反向序号。列表元素可以按序号 访问,列表的切片、内置的运算符(+、*、in、==)以及内置处理方法(例如findindex方 法、count方法等)与字符串操作一样,就不详细描述了。 这里介绍列表与字符串不同的操作。列表与字符串不同在于列表支持修改、添加和 删除操作,即列表是可变的。 (1)修改元素。 语法格式: 列表名[索引] = 新值 注意:序号索引方向分为正向或反向。详细用法参见例5.2。 (2)添加元素:有2个方法。 . 尾部追加元素:append方法,详细用法参见例5.3。 . 指定位置插入元素:insert方法。 (3)删除元素:有3个方法。 . 按索引删除元素:del命令。 . 按索引删除元素:pop方法,pop方法删除元素同时会返回该元素,缺省索引参数 时,pop默认删除最后一个元素。 . 按值删除元素:remove方法,列表中包含多个待删除元素时,remove删除索引值 相对较小的那个。 注意:命令和方法的区别;已知待删除元素的索引时,可使用del命令和pop方法; pop方法对于删除列表最末尾元素最为简单方便;明确知道待删除元素值时,用 remove方法更为简单。与del命令和remove方法不同,pop方法在删除元素的同时会 “弹出”这个被删除的元素,如果需要可以用一个变量“接住”它,以便进行进一步的后期 操作。 (4)其他常用操作: .sum 内置函数:计算列表的元素和。注意:对列表使用sum 函数时,列表必须是 数值型的。 . 排序:python中提供sort方法或sorted函数用于列表的排序,二者使用方法和 所带参数(即key和reverse)含义一致,但是sort方法排序会改变原来的列表,而 sorted函数排序是生成新的有序列表,不改变原来的列表。详细用法参考例5.4 的4种方法。 注意方法与函数的使用区别:方法是a.b的形式,a是对象名,b是方法名;而函数直 接使用函数名。 70 . 复制:即生成“一模一样”的列表。使用copy方法深复制,两个列表有独立空间; 通过列表之间的赋值操作是浅复制,两个列表共享空间。注意:copy方法和赋值 操作都能得到“一样”的列表,但是两者的实现机制有本质区别。 .列表的删除:del后直接跟列表名,则将彻底删除该列表对象。 .列表的清空:del列表名[:],经过删除“所有元素”的del操作后,列表中不包含 任何元素,但是仍保留其列表的本质。 3.元组 元组与列表类似,也是用来存放一组相关的数据。两者的不同之处主要有两点: .元组使用圆括号(),列表使用方括号[]。 .元组是不可变的序列,不能修改、删除和插入元素;而列表则是可变序列。 不带“[]”的输入转换为元组,即多个数输入以逗号隔开,默认为元组,如图5.2所示。 图5. 2 元组的整体输入输出界面 元组输入输出用法与列表类似,区别在于元组是用“()括(”) 起来的多个元素,但是圆括 号不是必须的,只要将各元素用逗号隔开,Python就会将其视为元组。 元组的元素不能修改。可以将元组理解为不能修改的“列表”,因此列表中不涉及元 素修改的操作都适用于元组。 使用元组的好处: .元组比列表操作速度快。如果定义了一个值的常量集,并且唯一的操作是不断地 遍历它,那么使用元组代替列表。 .如果对不需要修改的数据进行“写保护”,可以使代码更安全,此时使用元组而不 是列表,就如同拥有一个隐含的asert语句,说明这一数据是常量。如果必须要 改变这些值,则需要执行元组到列表的转换。 4.序列转换函数 本章介绍的列表、元组和前面学习的字符串都属于Python的一种基本数据类 型———序列(sequence)。序列的最大特点是元素的有序性,所以序列都是通过序号来访 问元素的。 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字表示它的 位置或索引:第一个索引是0,第二个索引是1,依此类推。Python已经内置确定序列的 长度以及确定最大和最小的元素的函数。Python有6个序列的内置类型,最常见的是列 第 5 章列表与元组 17 Python 程序设计学习辅导 表和元组。 序列之间可以通过转换函数进行互相转换: (1)元组通过list函数转换为列表,例如:list((1,2,3))结果是[1,2,3]。 (2)列表通过tuple函数转换为元组。 (3)字符串转换为列表有3种方法: . 使用list函数:list函数转换后字符串中的单个字符依次成为列表元素,例如list ("123")的结果是[1' ',2' ',3' ']。 . 使用字符串的split方法,利用split方法分割字符串生成字符串列表,语法格式 为:字符串.split(str="",num=string.count(str)),参数str是分隔符,默认为 所有的空字符,包括空格、换行(\n)、制表符(\t)等;参数num 是分割次数,默认 为-1,即分隔所有。设s="123",则s.split()的结果是[1' ',2' ',3' ']。 . 内置函数map与字符串的split方法配合使用,生成数值列表,例如:map(int,'1 234'.split())的结果是[1,2,3,4]。 5.2 本章示例 【例5.1】 用不同的方法实现列表的输入输出:输入列表,然后输出列表。 方法1: ls1=input() print ls1 用例输入: [1,2,3,4,5] 用例输出: [1, 2, 3, 4, 5] 代码解析:采用了最简单的列表输入输出方式。 方法2: ls2=map(int,raw_input().split()) 用例输入: 1 2 3 4 5 用例输出: [1, 2, 3, 4, 5] 代码解析:先使用raw_input函数以字符串形式接受数据,然后利用map函数和字 符串的split方法将其转换为整数类型的数值列表。语句map(int,raw_input().split()) 72 第5 章 列表与元组 输入多个数,空格分隔。 方法3: ls3=map(int,raw-input().split(',')) print ls3 用例输入: 1,2,3,4,5 用例输出: [1, 2, 3, 4, 5] 代码解析:先使用raw_input函数以字符串形式接受数据,然后利用map函数和字 符串的split方法将其转换为整数类型的数值列表。语句map(int,raw_input().split(','))输 入多个数,逗号分隔。 方法4: ls=input() print ls for c in ls: print c, 用例输入: [1,2,3,4,5] 用例输出: [1, 2, 3, 4, 5] 1 2 3 4 5 代码解析:采用列表ls作为迭代器进行遍历输出,比较简单。 方法5: ls=input() print ls for i in range(len(ls)): print ls[i], 用例输入: [1,2,3,4,5] 用例输出: [1, 2, 3, 4, 5] 1 2 3 4 5 代码解析:采用range函数作为迭代器,以列表ls长度作为range函数的取值范围, 73 Python 程序设计学习辅导 取索引对应的元素进行遍历输出,虽然实现相对复杂,但是可以灵活地控制列表项全部或 部分输出。 【例5.2】 用修改列表元素的方法实现:输入年和月,计算某年某月天数并输出。 思路是ls列表中存放一年12个月对应的天数,默认2月是28天,如果闰年,要修改 2月为29天。 ls=[31,28,31,30,31,30,31,31,30,31,30,31] year,month=input() if ((year % 4 == 0) and (year % 100 != 0)) or (year % 400 == 0): ls[1]=29 print ls[month-1] 用例输入: 2000,2 用例输出: 29 代码解析:通过列表索引方法实现,注意:修改2月天数时,ls[1]这条语句的“差1” 处理。 【例5.3】 用列表的append方法实现斐波那契数列构建前n 项并输出前n 项。 n=input() ls=[1,1] for i in range(2,n+1): m=ls[i-1]+ls[i-2] ls.append(m) print ls 用例输入: 5 用例输出: [1, 1, 2, 3, 5, 8] 代码解析:列表的append方法用于在列表末尾添加新的对象。 【例5.4】 用不同的排序方式实现对列表进行排序。 方法1: ls=input() ls.sort() print ls 用例输入: 74 第5 章 列表与元组 [3,5,-4,-1,0,-2,-6] 用例输出: [-6, -4, -2, -1, 0, 3, 5] 代码解析:从运行结果看,使用列表的sort方法排序ls,ls被修改,默认是升序排序。 方法2: ls=input() print sorted(ls) print ls 用例输入: [3,5,-4,-1,0,-2,-6] 用例输出: [-6, -4, -2, -1, 0, 3, 5] [3, 5, -4, -1, 0, -2, -6] 代码解析:从运行结果看,使用内置函数sorted,不修改列表ls,只是对ls进行排序, 返回一个排好序的新列表,因为运行结果的第二行输出的ls还是原来的值。 方法3: ls=input() ls.sort(reverse=True) print ls 用例输入: [3,5,-4,-1,0,-2,-6] 用例输出: [5, 3, 0, -1, -2, -4, -6] 代码解析:从运行结果看,使用列表的sort方法排序ls,ls被修改。默认是升序排 序,这里参数reverse=True表示降序排序。 方法4: ls=input() ls.sort(key=abs) print ls 用例输入: [3,5,-4,-1,0,-2,-6] 75 Python 程序设计学习辅导 用例输出: [0, -1, -2, 3, -4, 5, -6] 代码解析:这里参数key=abs表示按照列表中元素的绝对值大小升序排列,abs是 内置绝对值函数。该语句等价ls.sort(key=lambdax:abs(x)),匿名函数用法将在第6 章介绍。 5.3 本章练习题 本章的练习题可以分为2次完成,第1次练习侧重基础语法掌握,第2次练习侧重复 杂些的应用。 列表与元组练习1 【练习5.1】 月的英文。 题目描述:从键盘上输入一个数字,输入对应月的英文单词("January","February", "March","April","May","June","July","August","September","October","November", "December"),当数字不在1~12时,输出“Inputerror”。 用例输入: 1 用例输出: January 用例输入: 13 用例输出: Input error 【练习5.2】 输出大于均值的数。 题目描述:从键盘上输入10个数,计算均值,然后输出均值以及其中大于均值的数。 提示:循环+变量的方法虽然可以计算均值,但是要输出大于均值的数,必须要将输 入的多个数都保存下来,以便与均值进行比较。因此,本题使用循环+变量的方法无法实 现输出大于均值的数。怎么办? 如何将输入的多个数都保存下来? 需要列表。 用例输入: [21,42,13,54,75,96,77,98,29,100] 用例输出: ave=60.5 76 第5 章 列表与元组 75 96 77 98 100 【练习5.3】 山洞取宝。 题目描述:设一个山洞中有10个箱子,每个箱子中放着一块重量不等的宝石。进入 山洞后,最多只能拿一块宝石,如何实现? 用例输入: [21,42,13,54,75,96,77,98,29,10] 用例输出: max=98 【练习5.4】 某年某月有几天。 题目描述:从键盘输入某年某月,然后计算并输出该年该月有几天。 提示:方法1。闰年条件是四年一闰,百年不闰,四百年再闰,即if((year%4==0) and(year%100!=0))or(year%400==0): 方法2。importcalendar 然后ifcalendar.isleap(year):或者calendar.monthrange 函数。用 例输入: 2020,3 用例输出: 31 【练习5.5】 查找某个数。 题目描述:从键盘输入8个数,查找是否存在13。如果找到13,输出yes,否则输 出no。 用例输入: [21,42,13,54,75,96,77,98] 用例输出: yes 用例输入: [82,74,53,94,75,86,77,98] 用例输出: no 【练习5.6】 查找某个数出现的次数。 题目描述:从键盘输入若干个数,查找13出现几次,并输出次数,若无,则输出no。 用例输入: 77 Python 程序设计学习辅导 13,5,9,11,13,15,19 用例输出: 2 用例输入: 1,2,3,4 用例输出: no 【练习5.7】 删除数。 题目描述:已知列表[61,4,26,8,22,35,7,89,45,1]。从键盘输入整数n,若n 在列 表中,则删除n,并输出删除后的列表;若不存在n 则输出no。 用例输入: 4 用例输出: [61, 26, 8, 22, 35, 7, 89, 45, 1] 用例输入: 13 用例输出: no 【练习5.8】 升序排序。 题目描述:从键盘输入若干个整数,然后将这些数进行升序排序,并输出排序后 的数。用 例输入: [1,0,4,8,12,65,-76,100,-45,123] 用例输出: [-76, -45, 0, 1, 4, 8, 12, 65, 100, 123] 【练习5.9】 插入数。 题目描述:已知一个排好序的列表[1,2,3,6,8,9,12,23,33],从键盘上输入一个数 n,若列表中已经存在n,则输出no,否则将n 插入到列表中。要求插入n 后的列表依然 有序,输出新列表。 用例输入: 15 78