第3章
学习目标:php
列表是什么以及如何使用列表元素。列表让你可以在一个地方存储成组的信息,其中能够只包含几个元素,也能够包含数百万个元素。列表是新手可直接使用的最强大的Python功能之一,它融合了众多重要的编程概念。css
3.1 列表是什么python
列表由一系列按特定顺序排列的元素组成。你能够建立包含字母表中全部字母、数字0~9或
全部家庭成员姓名的列表;也能够将任何东西加入列表中,其中的元素之间能够没有任何关系。
鉴于列表一般包含多个元素,给列表指定一个表示复数的名称(如letters、digits或names)是
个不错的主意。nginx
在Python中,用中括号 [] 表示列表,并用逗号来分隔其中的元素。git
例如:编程
bicycles.py
bicycles = [ 'trek','cannondale','redline','specialired' ] print(bicycles) # 结果: ['trek', 'cannondale', 'redline', 'specialired']
3.1.1 访问列表元素ruby
列表是有序集合,所以要访问列表的任何元素,只需将该元素的位置或索引告诉Python便可。
要访问列表元素,可指出列表的名称,再指出元素的索引,并将其放在方括号内。bash
# 例如,从列表bicycles中提取第一款自行车 bicycles = [ 'trek','cannondale','redline','specialired' ] print(bicycles[0]) # 结果: trek # 固然,或者 可以使用方法title()让元素 'trek'的格式更整洁: print(bicycles[0].title()) # 这个示例的输出与前一个示例相同,只是首字母T是大写的。
3.1.2 检索从0而不是1开始app
在Python中,第一个列表元素的索引为0,而不是1。在大多数编程语言中都是如此,这与列
表操做的底层实现相关。编程语言
print(bicycles[1]) print(bicycles[3]) # 这些代码返回列表中得第二个和第四个元素: cannondale specialized # Python为访问最后一个列表元素提供了一种特殊语法。经过将索引指定为-1,可以让Python返 回最后一个列表元素: print(bicycles[-1]) 这些代码返回'specialized'。这种语法颇有用,由于你常常须要在不知道列表长度的状况 下访问最后的元素。这种约定也适用于其余负数索引,例如,索引-2返回倒数第二个列表元素, 索引-3返回倒数第三个列表元素,以此类推。
3.1.3 使用列表中的各个值
可像使用其余变量同样使用列表中的各个值。例如,你可使用拼接根据列表中的值来建立
消息。
下面来尝试从列表中提取第一款自行车,并使用这个值来建立一条消息:
message = "My first bicycle was a " + bicycles[0].title() + "." print(message) # 结果: My first bicycle was a Trek.
请尝试编写一些简短的程序来完成下面的练习,以得到一些使用Python 列表的第
一手经验。你可能须要为每章的练习建立一个文件夹,以整洁有序的方式存储为完成各
章的练习而编写的程序。
3-1 姓名:将一些朋友的姓名存储在一个列表中,并将其命名为names。依次访问
该列表中的每一个元素,从而将每一个朋友的姓名都打印出来。
names = [ 'zhangsan','lisi','wangwu','zhaoliu'] print(names[0]) print(names[1]) print(names[-2]) print(names[-1]) # 结果: zhangsan lisi wangwu zhaoliu
3-2 问候语:继续使用练习3-1 中的列表,但不打印每一个朋友的姓名,而为每人打
印一条消息。每条消息都包含相同的问候语,但抬头为相应朋友的姓名。
messname1 = "Hi " + names[0].title() + "." messname2 = "Hi " + names[1].title() + "." messname3 = "Hi " + names[2].title() + "." messname4 = "Hi " + names[3].title() + "." print(messname1) print(messname2) print(messname3) print(messname4) # 结果: Hi Zhangsan. Hi Lisi. Hi Wangwu. Hi Zhaoliu.
3-3 本身的列表:想一想你喜欢的通勤方式,如骑摩托车或开汽车,并建立一个包含
多种通勤方式的列表。根据该列表打印一系列有关这些通勤方式的宣言,如“I would like
to own a Honda motorcycle”。
bicycles = ['bike','electric car','motorbike','car'] mess1 = "I want to buy an " + bicycles[1].title() + "." print(mess1) # 结果: I want to buy an Electric Car.
3.2 修改、添加和删除元素
建立的大多数列表都将是动态的,这意味着列表建立后,将随着程序的运行增删元素。例如:你建立一个游戏,要求玩家射杀从天而降的外星人;为此,可在开始时将一些外星人存储在
列表中,而后每当有外星人被射杀时,都将其从列表中删除,而每次有新的外星人出如今屏幕上
时,都将其添加到列表中。在整个游戏运行期间,外星人列表的长度将不断变化。
3.2.1 修改列表元素
修改列表元素的语法与访问列表元素的语法相似。要修改列表元素,可指定列表名和要修改
的元素的索引,再指定该元素的新值。
例如:
motorcycles.py
-----------------------------------------
motorcycles = ['honda','yamaha','suzuki'] print(motorcycles) motorcycles[0] = 'ducati' print(motorcycles) ----------------------------------------- ['honda', 'yamaha', 'suzuki'] ['ducati', 'yamaha', 'suzuki']
3.2.2 在列表中添加元素
你可能出于众多缘由要在列表中添加新元素,例如,你可能但愿游戏中出现新的外星人、添
加可视化数据或给网站添加新注册的用户。Python提供了多种在既有列表中添加新数据的方式。
在列表中添加新元素时,最简单的方式是将元素附加列表末尾。给列表附加元素时,它将
添加到列表末尾。继续使用前一个示例中的列表,在其末尾添加新元素'ducati':
motorcycles.append('ducati') print(motorcycles) --------------------------------------- ['ducati', 'yamaha', 'suzuki', 'ducat'] # 方法append()将元素'ducati'添加到了列表末尾 ,而不影响列表中的其余全部元素
方法append()让动态地建立列表易如反掌,例如,你能够先建立一个空列表,再使用一系列的
append()语句添加元素。下面来建立一个空列表,再在其中添加元素'honda'、'yamaha'和'suzuki':
motorcycles = []
motorcycles.append('honda') motorcycles.append('yamaha') motorcycles.append('suzuki') print(motorcycles) ----------------------------- ['honda', 'yamaha', 'suzuki']
这种建立列表的方式极其常见,由于常常要等程序运行后,你才知道用户要在程序中存储哪
些数据。为控制用户,可首先建立一个空列表,用于存储用户将要输入的值,而后将用户提供的
每一个新值附加到列表中。
使用方法insert()可在列表的任何位置添加新元素。为此,你须要指定新元素的索引和值。
motorcycles.insert(0,'ducati') print(motorcycles) --------------------------------------- ['ducati', 'honda', 'yamaha', 'suzuki'] # 在这个示例中,值'ducati'被出入到列表开头;方法insert()在索引0处添加空间,并将值'ducati'存储到这个地方。这种操做将列表中既有的每一个元素都右一个位置。
3.2.3 从列表中删除元素
你常常须要从列表中删除一个或多个元素。例如,玩家将空中的一个外星人射杀后,你很可
能要将其从存活的外星人列表中删除;当用户在你建立的Web应用中注销其帐户时,你须要将该
用户从活跃用户列表中删除。你能够根据位置或值来删除列表中的元素。
# 知道要删除的元素所在列表中的位置,可以使用del语句 motorcycles = ['ducati', 'honda', 'yamaha', 'suzuki'] del motorcycles[0] print(motorcycles) ----------------------------- ['honda', 'yamaha', 'suzuki']
有时候,你要将元素从列表中删除,并接着使用它的值。例如,你可能须要获取刚被射杀的
外星人的x和y坐标,以便在相应的位置显示爆炸效果;在Web应用程序中,你可能要将用户从活
跃成员列表中删除,并将其加入到非活跃成员列表中。
方法pop()可删除列表末尾的元素,并让你可以接着使用它。术语弹出(pop)源自这样的类
比:列表就像一个栈,而删除列表末尾的元素至关于弹出栈顶元素。
motorcycles = ['honda','yamaha','suzuki'] print(motorcycles) popped_motorcycle = motorcycles.pop() print(motorcycles) print(popped_motorcycle) ------------------------------------------ ['honda', 'yamaha', 'suzuki'] ['honda', 'yamaha'] suzuki
方法pop()是怎么起做用的呢?假设列表中的摩托车是按购买时间存储的,就可以使用方法
pop()打印一条消息,指出最后购买的是哪款摩托车:
motorcycles = ['honda', 'yamaha', 'suzuki'] last_owned = motorcycles.pop() print("The last motorcycle I owned was a " + last_owned.title() + ".") ----------------------------------------------------------------------- The last motorcycle I owned was a Suzuki.
可使用pop()来删除列表中任何位置的元素,只需在括号中指定要删除的元素
的索引便可。
first_owned = motorcycles.pop(0)
print("The last motorcycle I owned was a " + first_owned.title() + ".") ------------------------------------------------------------------------- The last motorcycle I owned was a Honda.
若是你不肯定该使用del语句仍是pop()方法,下面是一个简单的判断标准:若是你要从列表
中删除一个元素,且再也不以任何方式使用它,就使用del语句;若是你要在删除元素后还能继续
使用它,就使用方法pop()。
有时候,你不知道要从列表中删除的值所处的位置。若是你只知道要删除的元素的值,可以使
用方法remove()。
# 假设咱们要从列表motorcycles中删除值'ducati' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< motorcycles = ['honda', 'yamaha', 'suzuki','ducati'] motorcycles.remove('ducati') print(motorcycles) ----------------------------------------------------- ['honda', 'yamaha', 'suzuki']
使用remove()从列表中删除元素时,也可接着使用它的值。下面删除值'ducati',并打印一
条消息,指出要将其从列表中删除的缘由:
motorcycles = ['honda', 'yamaha', 'suzuki','ducati'] too_expensive = 'ducati' motorcycles.remove(too_expensive) print(motorcycles) print("\nA " + too_expensive.title() + " is too expensive for me.") ------------------------------------------------------------------- ['honda', 'yamaha', 'suzuki'] A Ducati is too expensive for me.
注意 方法remove()只删除第一个指定的值。若是要删除的值可能在列表中出现屡次,就须要
使用循环来判断是否删除了全部这样的值。你将在第7章学习如何这样作。
下面的练习比第2 章的练习要复杂些,但让你有机会之前面介绍过的各类方式使用
列表。
3-4 嘉宾名单:若是你能够邀请任何人一块儿共进晚餐(不管是在世的仍是故去的),
你会邀请哪些人?请建立一个列表,其中包含至少3 个你想邀请的人;而后,使用这个
列表打印消息,邀请这些人来与你共进晚餐。
dinner = []
dinner.append('zhangsan') dinner.append('lisi') dinner.append('wangwu') print(dinner) --------------------------------------- ['zhangsan', 'lisi', 'wangwu']
3-5 修改嘉宾名单:你刚得知有位嘉宾没法赴约,所以须要另外邀请一位嘉宾。
dinner = []
dinner.append('zhangsan') dinner.append('lisi') dinner.append('wangwu') print(dinner) dinner[1] = 'zhaoliu' print(dinner) -------------------------------- ['zhangsan', 'lisi', 'wangwu'] ['zhangsan', 'zhaoliu', 'wangwu']
dinner = []
dinner.append('zhangsan') dinner.append('lisi') dinner.append('wangwu') print(dinner) no_dinner = dinner.pop(1) print(no_dinner + " 没法赴约") --------------------------------- ['zhangsan', 'lisi', 'wangwu'] lisi 没法赴约
dinner = []
dinner.append('zhangsan') dinner.append('lisi') dinner.append('wangwu') print(dinner) no_dinner = dinner.pop(1) dinner.insert(1,'zhaoliu') print(dinner) -------------------------------- ['zhangsan', 'lisi', 'wangwu'] ['zhangsan', 'zhaoliu', 'wangwu']
....上述代码省略
print(dinner[0]) print(dinner[1]) print(dinner[2]) -------------------- zhangsan zhaoliu wangwu
3-6 添加嘉宾:你刚找到了一个更大的餐桌,可容纳更多的嘉宾。请想一想你还想邀
请哪三位嘉宾。
print("找到了一个更大的餐桌") ------------------------------ 找到了一个更大的餐桌
dinner.insert(0,'xiaoming') print(dinner) --------------------------------------------- ['xiaoming', 'zhangsan', 'zhaoliu', 'wangwu']
dinner.insert(2,'xiaofang') print(dinner) --------------------------------------------------------- ['xiaoming', 'zhangsan', 'xiaofang', 'zhaoliu', 'wangwu']
dinner.append('xiaowu') print(dinner) ------------------------------------------------------------------- ['xiaoming', 'zhangsan', 'xiaofang', 'zhaoliu', 'wangwu', 'xiaowu']
print("邀请: " + dinner[0]) print("邀请: " + dinner[1]) print("邀请: " + dinner[2]) print("邀请: " + dinner[3]) print("邀请: " + dinner[4]) print("邀请: " + dinner[5]) ----------------------------- 邀请: xiaoming 邀请: zhangsan 邀请: xiaofang 邀请: zhaoliu 邀请: wangwu 邀请: xiaowu
3-7 缩减名单:你刚得知新购买的餐桌没法及时送达,所以只能邀请两位嘉宾。
print("只能邀请两位嘉宾共进晚餐!")
no_dinner = dinner.pop()
print("I'm sorry " + no_dinner) no_dinner = dinner.pop() print("I'm sorry " + no_dinner) no_dinner = dinner.pop() print("I'm sorry " + no_dinner) no_dinner = dinner.pop() print("I'm sorry " + no_dinner) ------------------------------- I'm sorry xiaowu I'm sorry wangwu I'm sorry zhaoliu I'm sorry xiaofang
print(dinner) ------------------------ ['xiaoming', 'zhangsan']
del dinner[0] del dinner[0] print(dinner) ------------- []
3.3 组织列表
在你建立的列表中,元素的排列顺序经常是没法预测的,由于你并不是总能控制用户提供数据
的顺序。这虽然在大多数状况下都是不可避免的,但你常常须要以特定的顺序呈现信息。有时候,
你但愿保留列表元素最初的排列顺序,而有时候又须要调整排列顺序。Python提供了不少组织列
表的方式,可根据具体状况选用。
3.3.1 使用方法sort()对列表进行永久性排序
Python方法sort()让你可以较为轻松地对列表进行排序。假设你有一个汽车列表,并要让其
中的汽车按字母顺序排列。为简化这项任务,咱们假设该列表中的全部值都是小写的。
cars.py
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
cars = ['bmw','audi','toyota','subaru'] cars.sort() print(cars) ----------------------------------- ['audi', 'bmw', 'subaru', 'toyota'] # 方法sort() 永久性地修改了列表元素的排列顺序。 # 如今,汽车是按字母顺序排列额,再也没法恢复到原来的排列顺序
你还能够按与字母顺序相反的顺序排列列表元素,为此,只需向sort()方法传递参数
reverse=True。下面的示例将汽车列表按与字母顺序相反的顺序排列:
cars = ['bmw','audi','toyota','subaru'] cars.sort(reverse=True) print(cars) ----------------------------------- ['toyota', 'subaru', 'bmw', 'audi']
3.3.2 使用函数sorted()对列表进行临时排序
要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可以使用函数sorted()。函数
sorted()让你可以按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序。
下面尝试对汽车列表调用这个函数。
cars = ['bmw','audi','toyota','subaru'] print("Here is the original list:") print(cars) print("\nHere is the sorted list:") print(sorted(cars)) print("\nHere is the original list again:") print(cars) -------------------------------------------- Here is the original list: ['bmw', 'audi', 'toyota', 'subaru'] Here is the sorted list: ['audi', 'bmw', 'subaru', 'toyota'] Here is the original list again: ['bmw', 'audi', 'toyota', 'subaru']
注意,调用函数sorted()后,列表元素的排列顺序并无变。若是你要按与字母顺
序相反的顺序显示列表,也可向函数sorted()传递参数reverse=True。
注意 在并不是全部的值都是小写时,按字母顺序排列列表要复杂些。决定排列顺序时,有多种
解读大写字母的方式,要指定准确的排列顺序,可能比咱们这里所作的要复杂。然而,
大多数排序方式都基于本节介绍的知识。
3.3.3 倒着打印列表
要反转列表元素的排列顺序,可以使用方法reverse()。假设汽车列表是按购买时间排列的,
可轻松地按相反的顺序排列其中的汽车:
cars = ['bmw','audi','toyota','subaru'] print(cars) cars.reverse() print(cars) ----------------------------------------- ['bmw', 'audi', 'toyota', 'subaru'] ['subaru', 'toyota', 'audi', 'bmw']
注意,reverse()不是指按与字母顺序相反的顺序排列列表元素,而只是反转列表元素的排
列顺序。
方法reverse()永久性地修改列表元素的排列顺序,但可随时恢复到原来的排列顺序,为此
只需对列表再次调用reverse()便可。
3.3.4 肯定列表的长度
使用函数len()可快速获悉列表的长度。在下面的示例中,列表包含4个元素,所以其长度为4:
>>> cars = ['bmw','audi','toyota','subaru'] >>> len(cars) 4
在你须要完成以下任务时,len()颇有用:肯定还有多少个外星人未被射杀,须要管理多少
项可视化数据,网站有多少注册用户等。
注意 Python计算列表元素数时从1开始,所以肯定列表长度时,你应该不会遇到差一错误。
3-8 放眼世界:想出至少5 个你渴望去旅游的地方。
toponymy = ['thailand','Singapore','japanese','egypt','america']
print(toponymy) ---------------------------------------------------------- ['thailand', 'Singapore', 'japanese', 'egypt', 'america']
print(sorted(toponymy)) --------------------------------------------------------- ['america', 'egypt', 'japanese', 'singapore', 'thailand']
print(toponymy) --------------------------------------------------------- ['thailand', 'singapore', 'japanese', 'egypt', 'america']
toponymy = ['thailand','japanese','singapore','egypt','america'] print(sorted(toponymy,reverse=True)) ---------------------------------------------------------------- ['thailand', 'singapore', 'japanese', 'egypt', 'america']
print(toponymy) --------------------------------------------------------- ['thailand', 'japanese', 'singapore', 'egypt', 'america']
toponymy = ['thailand','japanese','singapore','egypt','america'] print("Original list: ") print(toponymy) toponymy.reverse() print("\nModify the list: ") print(toponymy) --------------------------------------------------------- Original list: ['thailand', 'japanese', 'singapore', 'egypt', 'america'] Modify the list: ['america', 'egypt', 'singapore', 'japanese', 'thailand']
toponymy.reverse() print("\nModify the following list again: ") print(toponymy) ----------------------------------------------------------- Modify the following list again: ['thailand', 'japanese', 'singapore', 'egypt', 'america']
toponymy = ['thailand','japanese','singapore','egypt','america'] toponymy.sort() print(toponymy) --------------------------------------------------------- ['america', 'egypt', 'japanese', 'singapore', 'thailand']
toponymy = ['thailand','japanese','singapore','egypt','america'] toponymy.sort() print(toponymy) toponymy.sort(reverse=True) print(toponymy) ---------------------------------------------------------- ['america', 'egypt', 'japanese', 'singapore', 'thailand'] ['thailand', 'singapore', 'japanese', 'egypt', 'america']
3-9 晚餐嘉宾:在完成练习3-4~练习3-7时编写的程序之一中,使用len()打印一条消息,指出你邀请了多少位嘉宾来与你共进晚餐。
>>> cars = ['bmw','audi','toyota','subaru'] >>> len(cars) 4
3-10 尝试使用各个函数:想一想可存储到列表中的东西,如山岳、河流、国家、城市、语言或你喜欢的任何东西。编写一个程序,在其中建立一个包含这些元素的列表,而后,对于本章介绍的每一个函数,都至少使用一次来处理这个列表。
name = ['mount everest','yellow river','beijing','china'] print(name) print("\n临时排序: ") print(sorted(name)) print("\n临时相反排序: ") print(sorted(name,reverse=True)) print("\n按字母顺序相反排序: ") name.sort(reverse=True) print(name) print("\n按字母排序: ") name.sort() print(name) print("\n倒着打印: ") name.reverse() print(name) print("\n元素个数: ") print(len(name)) print("\n元素个数: %d" % len(name)) ---------------------------------------------------------- ['mount everest', 'yellow river', 'beijing', 'china'] 临时排序: ['beijing', 'china', 'mount everest', 'yellow river'] 临时相反排序: ['yellow river', 'mount everest', 'china', 'beijing'] 按字母顺序相反排序: ['yellow river', 'mount everest', 'china', 'beijing'] 按字母排序: ['beijing', 'china', 'mount everest', 'yellow river'] 倒着打印: ['yellow river', 'mount everest', 'china', 'beijing'] 元素个数: 4 元素个数: 4