第3章 列表简介
列表让你能够在一个地方存储成组的信息,其中可以只包含几个元素,也可以包含数百万个元素。列表是新手可直接使用的最强大的Python功能之一,它融合了众多重要的编程概念。
3.1 列表是什么
1 bicycles = ['trek','cannondale','redline','specialized'] 2 print(bicycles)
①列表由一系列按特定顺序排列的元素组成。你可以创建包含字符串和数字的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系。
②在Python中,用方括号( [] )来表示列表,并用逗号来分隔其中的元素。如行1
3.1.1 访问列表元素
1 bicycles = ['trek','cannondale','redline','specialized'] 2 print(bicycles[0]) 3 print(bicycles[0].title())
①列表是有序集合,因此要访问列表的任何元素,只需将该元素的位置或索引告诉Python即可。
②要访问列表元素,可指出列表的名称,再指出元素的索引,并将其放在方括号内。如行2
③当你请求获取列表元素时,Python只返回该元素,而不包括方括号和引号:
④可以对任何列表元素调用字符串方法。如行3,调用字符串的title()
3.1.2 索引从 0 而不是 1 开始
1 bicycles = ['trek','cannondale','redline','specialized'] 2 print(bicycles[1]) 3 print(bicycles[3]) 4 print(bicycles[-1]) 5 print(bicycles[-2])
①在Python中,第一个列表元素的索引为0,而不是1。
②第二个列表元素的索引为1。根据这种简单的计数方式,要访问列表的任何元素,都可将其位置减1,并将结果作为索引。如行2、3
③Python为访问最后一个列表元素提供了一种特殊语法。通过将索引指定为 -1 ,可让Python返回最后一个列表元素。如行4
④-1索引在不知道列表长度的情况下访问最后的元素。这种约定也适用于其他负数索引。如行5
3.1.3 使用列表中的各个值
1 bicycles = ['trek','cannondale','redline','specialized'] 2 message = "My first bicycle was a " + bicycles[0].title() + "." 3 print(message)
①可像使用其他变量一样使用列表中的各个值。
②可以使用拼接根据列表中的值来创建消息。如行2
1 #习题1
将一些朋友的姓名存储在一个列表中,并将其命名为 names 。依次访问该列表中的每个元素,从而将每个朋友的姓名都打印出来。
2 names = ['张**', '赵**', '沈**', '王**'] 3 print(names[0]) 4 print(names[1]) 5 print(names[2]) 6 print(names[3]) 7 #习题2
继续使用练习1的列表,但不打印每个朋友的姓名,而为每人打印一条消息。每条消息都包含相同的问候语,但抬头为相应朋友的姓名。
8 names = ['张**', '赵**', '沈**', '王**'] 9 question = ',吃饭了吗?' 10 print(names[0]+question) 11 print(names[1]+question) 12 print(names[2]+question) 13 print(names[3]+question) 14 #习题3
想想你喜欢的通勤方式,如骑摩托车或开汽车,并创建一个包含多种通勤方式的列表。根据该列表打印一系列有关这些通勤方式的宣言,如“I would like to own a Honda motorcycle”。
15 commuter_way = ['自行车','地铁','的士','公交'] 16 love = '我最喜欢的通勤方式是' 17 print(love + commuter_way[1])
3.2 修改、添加和删除元素
大多数列表都将是动态的,列表创建后,将随着程序的运行增删元素。
3.2.1 修改列表元素
1 motorcycles = ['honda', 'yamaha', 'suzuki'] 2 print(motorcycles) 3 motorcycles[0] = 'ducati' 4 print(motorcycles)
①要修改列表元素,可指定列表名和要修改的元素的索引,再指定该元素的新值。如行3
②可以修改任何列表元素的值,而不仅仅是第一个元素的值。
3.2.2 在列表中添加元素
Python提供了多种在既有列表中添加新数据的方式。
1. 在列表末尾添加元素
1 motorcycles = ['honda', 'yamaha', 'suzuki'] 2 print(motorcycles) 3 motorcycles.append('ducati') 4 print(motorcycles) 5 motorcycles = [] 6 motorcycles.append('honda') 7 motorcycles.append('yamaha') 8 motorcycles.append('suzuki') 9 print(motorcycles)
①在列表中添加新元素时,最简单的方式是将元素附加到列表末尾。
②方法 append() 将元素 添加到了列表末尾,而不影响列表中的其他所有元素。如行3
③方法 append() 让动态地创建列表易如反掌,如行5、6、7、8
2. 在列表中插入元素
1 motorcycles = ['honda', 'yamaha', 'suzuki'] 2 motorcycles.insert(0, 'ducati') 3 print(motorcycles)
①方法 insert() 可在列表的任何位置添加新元素。但需要指定新元素的索引和值。如行2
②insert()使索引后的包括索引的每个元素都右移一个位置。
3.2.3 从列表中删除元素
1. 使用 del 语句删除元素
1 motorcycles = ['honda', 'yamaha', 'suzuki'] 2 print(motorcycles) 3 del motorcycles[0] 4 print(motorcycles) 5 motorcycles = ['honda', 'yamaha', 'suzuki'] 6 print(motorcycles) 7 del motorcycles[1] 8 print(motorcycles)
①删除已知位置的元素,可使用 del 语句。如行3、7
②使用 del 语句将值从列表中删除后,你就无法再访问它了。
2. 使用方法 pop() 删除元素
1 motorcycles = ['honda', 'yamaha', 'suzuki'] 2 print(motorcycles) 3 poped_motorcycle = motorcycles.pop() 4 print(motorcycles) 5 print(poped_motorcycle) 6 motorcycles = ['honda', 'yamaha', 'suzuki'] 7 last_owned = motorcycles.pop() 8 print("The last motorcycle I owned was a " + last_owned.title() + ".")
①方法 pop() 可删除列表末尾的元素,并让你能够接着使用它。
②将方法 pop() 删除的元素储存到一个变量里,使我们可以使用它,通过使用变量。
3. 弹出列表中任何位置处的元素
1 motorcycles = ['honda', 'yamaha', 'suzuki'] 2 first_owned = motorcycles.pop(0) 3 print('The first motorcycle I owned was a ' + first_owned.title() + '.')
①可以使用 pop() 来删除列表中任何位置的元素,只需在括号中指定要删除的元素的索引即可。如行2
②当你使用 pop() 时,被弹出的元素就不再在列表中了。
③如果你不确定该使用 del 语句还是 pop() 方法,下面是一个简单的判断标准:
如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用 del 语句;
如果你要在删除元素后还能继续使用它,就使用方法 pop() 。
4. 根据值删除元素
1 motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati'] 2 print(motorcycles) 3 motorcycles.remove('ducati') 4 print(motorcycles) 5 motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati'] 6 print(motorcycles) 7 too_expensive = 'ducati' 8 motorcycles.remove(too_expensive) 9 print(motorcycles) 10 print(" A " + too_expensive.title() + "is too expensive for me")
①当不知道要从列表中删除的值所处的位置,只知道要删除的元素的值,可使用方法 remove() 。如行3
②方法 remove() 只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。你将在第7章学习如何这样做。
1 #习题1
嘉宾名单:如果你可以邀请任何人一起共进晚餐(无论是在世的还是故去的),你会邀请哪些人?请创建一个列表,其中包含至少 3个你想邀请的人;然后,使用这个列表打印消息,邀请这些人来与你共进晚餐。
2 names = ['张**', '沈**', '赵**', '王**'] 3 question = ',能一起共进晚餐吗?' 4 print(names[0] + question) 5 print(names[1] + question) 6 print(names[2] + question) 7 print(names[3] + question) 8 9 #练习2
修改嘉宾名单:你刚得知有位嘉宾无法赴约,因此需要另外邀请一位嘉宾。
以完成练习1时编写的程序为基础,在程序末尾添加一条 print 语句,指出哪位嘉宾无法赴约。
修改嘉宾名单,将无法赴约的嘉宾的姓名替换为新邀请的嘉宾的姓名。
再次打印一系列消息,向名单中的每位嘉宾发出邀请。
10 names = ['张**', '沈**', '赵**', '王**'] 11 question = ',能一起共进晚餐吗?' 12 print(names[0] + question) 13 print(names[1] + question) 14 print(names[2] + question) 15 print(names[3] + question) 16 print(names[1] + ",不能共进晚餐。") 17 names[1] = '周**' 18 print(names[0] + question) 19 print(names[1] + question) 20 print(names[2] + question) 21 print(names[3] + question) 22 23 #练习3
添加嘉宾:你刚找到了一个更大的餐桌,可容纳更多的嘉宾。请想想你还想邀请哪三位嘉宾。
以完成练习1或练习2时编写的程序为基础,在程序末尾添加一条 print 语句,指出你找到了一个更大的餐桌。
使用 insert() 将一位新嘉宾添加到名单开头。
使用 insert() 将另一位新嘉宾添加到名单中间。
使用 append() 将最后一位新嘉宾添加到名单末尾。
打印一系列消息,向名单中的每位嘉宾发出邀请。
24 names = ['张**', '沈**', '赵**', '王**'] 25 question = ',能一起共进晚餐吗?' 26 print(names[0] + question) 27 print(names[1] + question) 28 print(names[2] + question) 29 print(names[3] + question) 30 print(names[1] + ",不能共进晚餐。") 31 names[1] = '周**' 32 print(names[0] + question) 33 print(names[1] + question) 34 print(names[2] + question) 35 print(names[3] + question) 36 print('我找到了一个更大的餐桌。') 37 names.insert(0,'徐**') 38 names.insert(2,'志玛**') 39 names.append('钏**') 40 print(names[0] + question) 41 print(names[1] + question) 42 print(names[2] + question) 43 print(names[3] + question) 44 print(names[4] + question) 45 print(names[5] + question) 46 print(names[6] + question) 47 48 #练习4
缩减名单:你刚得知新购买的餐桌无法及时送达,因此只能邀请两位嘉宾。
以完成练习 3-6时编写的程序为基础,在程序末尾添加一行代码,打印一条你只能邀请两位嘉宾共进晚餐的消息。
使用 pop() 不断地删除名单中的嘉宾,直到只有两位嘉宾为止。每次从名单中弹出一位嘉宾时,都打印一条消息,让该嘉宾知悉你很抱歉,无法邀请他来共进晚餐。
对于余下的两位嘉宾中的每一位,都打印一条消息,指出他依然在受邀人之列。
使用 del 将最后两位嘉宾从名单中删除,让名单变成空的。打印该名单,核实程序结束时名单确实是空的。
49 names = ['张**', '沈**', '赵**', '王**'] 50 question = ',能一起共进晚餐吗?' 51 print(names[0] + question) 52 print(names[1] + question) 53 print(names[2] + question) 54 print(names[3] + question) 55 print(names[1] + ",不能共进晚餐。") 56 names[1] = '周**' 57 print(names[0] + question) 58 print(names[1] + question) 59 print(names[2] + question) 60 print(names[3] + question) 61 print('我找到了一个更大的餐桌。') 62 names.insert(0,'徐**') 63 names.insert(2,'志玛**') 64 names.append('钏**') 65 print(names[0] + question) 66 print(names[1] + question) 67 print(names[2] + question) 68 print(names[3] + question) 69 print(names[4] + question) 70 print(names[5] + question) 71 print(names[6] + question) 72 print('对不起,我只能邀请2位嘉宾了') 73 sorry_people = names.pop() 74 print(sorry_people + ",对不起,不能一起共进晚餐了!") 75 sorry_people = names.pop() 76 print(sorry_people + ",对不起,不能一起共进晚餐了!") 77 sorry_people = names.pop() 78 print(sorry_people + ",对不起,不能一起共进晚餐了!") 79 sorry_people = names.pop() 80 print(sorry_people + ",对不起,不能一起共进晚餐了!") 81 sorry_people = names.pop() 82 print(sorry_people + ",对不起,不能一起共进晚餐了!") 83 print(names[0] + ",最终仍能一起共进晚餐。") 84 print(names[1] + ",最终仍能一起共进晚餐。") 85 del names[0] 86 del names[0] 87 print(names)
3.3 组织列表
3.3.1 使用方法 sort() 对列表进行永久性排序
1 cars = ['bmw', 'audi', 'toyota', 'subaru'] 2 cars.sort() 3 print(cars)
#['audi', 'bmw', 'subaru', 'toyota'] 4 cars = ['bmw', 'audi', 'toyota', 'subaru'] 5 cars.sort(reverse = Ture) 6 print(cars)
#['toyota', 'subaru', 'bmw', 'audi']
①列表的 sort() 方法,能够对列表按字母顺序进行排序。如行2
②可以与字母顺序相反的顺序排列列表元素,向sort() 方法传递参数reverse=True 。如行5
③sort()仅改变列表顺序,并不会返回列表
3.3.2 使用函数 sorted() 对列表进行临时排序
1 cars = ['bmw', 'audi', 'toyota', 'subaru'] 2 print("Here is the original list:") 3 print(cars)
#Here is the original list:
#['bmw', 'audi', 'toyota', 'subaru'] 4 print(" Here is the sorted list:") 5 print(sorted(cars))
#Here is the sorted list:
#['audi', 'bmw', 'subaru', 'toyota'] 6 print(" Here is the original list again:") 7 print(cars)
#Here is the original list again:
#['bmw', 'audi', 'toyota', 'subaru']
①函数sorted() 能够按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序。如行5
②如果你要按与字母顺序相反的顺序显示列表,也可向函数 sorted() 传递参数 reverse=True 。
3.3.3 倒着打印列表
1 cars = ['bmw', 'audi', 'toyota', 'subaru'] 2 print(cars)
#['bmw', 'audi', 'toyota', 'subaru'] 3 cars.reverse() 4 print(cars)
#['subaru', 'toyota', 'audi', 'bmw']
①方法 reverse() 可以反转列表元素的排列顺序。
② reverse() 不是指按与字母顺序相反的顺序排列列表元素,而只是反转列表元素的排列顺序
③方法 reverse() 永久性地修改列表元素的排列顺序,但可随时恢复到原来的排列顺序,为此只需对列表再次调用 reverse() 即可。
3.3.4 确定列表的长度
1 cars = ['bmw', 'audi', 'toyota', 'subaru'] 2 print(len(cars))
#4
①使用函数 len() 可快速获悉列表的长度。
1 #习题1 2 """ 3 放眼世界:想出至少 5个你渴望去旅游的地方。 4 将这些地方存储在一个列表中,并确保其中的元素不是按字母顺序排列的。 5 按原始排列顺序打印该列表。不要考虑输出是否整洁的问题,只管打印原始Python列表。 6 使用 sorted() 按字母顺序打印这个列表,同时不要修改它。 7 再次打印该列表,核实排列顺序未变。 8 使用 sorted() 按与字母顺序相反的顺序打印这个列表,同时不要修改它。 9 再次打印该列表,核实排列顺序未变。 10 使用 reverse() 修改列表元素的排列顺序。打印该列表,核实排列顺序确实变了。 11 使用 reverse() 再次修改列表元素的排列顺序。打印该列表,核实已恢复到原来的排列顺序。 12 使用 sort() 修改该列表,使其元素按字母顺序排列。打印该列表,核实排列顺序确实变了。 13 使用 sort() 修改该列表,使其元素按与字母顺序相反的顺序排列。打印该列表,核实排列顺序确实变了。 14 """ 15 travels = ['paris', 'greece', 'provence', 'london', 'tokyo'] 16 print(travels) 17 print(sorted(travels)) 18 print(travels) 19 print(sorted(travels,reverse=True)) 20 print(travels) 21 travels.reverse() 22 print(travels) 23 travels.reverse() 24 print(travels) 25 travels.sort() 26 print(travels) 27 travels.sort(reverse=True) 28 print(travels) 29 30 #习题2 31 #晚餐嘉宾:使用 len() 打印一条消息,指出你邀请了多少位嘉宾来与你共进晚餐。 32 names = ['张**', '沈**', '赵**', '王**'] 33 print(len(names)) 34 #习题3 35 """ 36 尝试使用各个函数:想想可存储到列表中的东西,如山岳、河流、国家、城市、语言或你喜欢的任何东西。 37 编写一个程序,在其中创建一个包含这些元素的列表,然后,对于本章介绍的每个函数,都至少使用一次来处理这个列表。 38 """ 39 citys = ['shanghai', 'hunan', 'tianjin', 'beijing'] 40 print(citys[1]) 41 print(citys[-1]) 42 print(citys[2].title() + ' is where I work.') 43 citys[1] = 'hubei' 44 print(citys) 45 citys.append('hunan') 46 print(citys) 47 citys.insert(3,'shenzhen') 48 print(citys) 49 del citys[-1] 50 print(citys) 51 city = citys.pop() 52 print(city) 53 print(citys) 54 city = citys.pop(1) 55 print(city) 56 print(citys) 57 citys.remove('shenzhen') 58 print(citys) 59 citys.append('hunan') 60 citys.append('shenzhen') 61 citys.append('beijing') 62 print(citys) 63 citys.sort() 64 print(citys) 65 citys.sort(reverse=True) 66 print(citys) 67 print(sorted(citys)) 68 print(citys) 69 print(sorted(citys,reverse=True)) 70 print(citys) 71 citys.reverse() 72 print(citys) 73 print(len(citys))
3.4 使用列表时避免索引错误
1 motorcycles = ['honda', 'yamaha', 'suzuki'] 2 print(motorcycles[3]) 3 """ 4 Traceback (most recent call last): 5 File "E:/python/代码/caogao.py", line 3, in <module> 6 print(motorcycles[3]) 7 IndexError: list index out of range 8 """ 9 print(motorcycles[-1])
#suzuki 10 motorcycles = [] 11 print(motorcycles[-1]) 12 """ 13 Traceback (most recent call last): 14 File "E:/python/代码/caogao.py", line 12, in <module> 15 print(motorcycles[-1]) 16 IndexError: list index out of range 17 """
①索引错误意味着Python无法理解你指定的索引。程序发生索引错误时,请尝试将你指定的索引减1,然后再次运行程序,看看结果是否正确。如行2
②仅当列表为空时,这种访问最后一个元素的方式才会导致错误。如行11
③发生索引错误却找不到解决办法时,请尝试将列表或其长度打印出来。列表可能与你以为的截然不同,在程序对其进行了动态处理时尤其如此。通过查看列表或其包含的元素数,可帮助你找出这种逻辑错误。
3.5 小结