
4.2 列表的遍历、排序和查找
4.2.1 列表的遍历
我们经常需要遍历列表的所有元素,对每个元素执行相同的操作。例如,在游戏中,可能需要将每个界面元素平移相同的距离;对于包含数字的列表,可能需要对每个元素执行相同的统计运算;在网站中,可能需要显示文章列表中的每个标题。需要对列表中的每个元素都执行相同的操作时,可使用Python中的for循环。
假设我们有一个班级学生名单,需要将其中每个学生的名字都打印出来。为此,我们可以分别获取名单中的每个名字,但这种做法会导致多个问题。例如,如果名单很长,将包含大量重复的代码。另外,每当名单的长度发生变化时,都必须修改代码。通过使用for循环,可让Python去处理这些问题。
下面使用for循环来打印学生名单中的所有名字。
【示例1】 列表的遍历

首先,我们定义了一个列表(见❶)。接下来,我们定义了一个for循环(见❷);这行代码让Python从列表students中取出一个名字,并将其存储在变量student中。最后,我们让Python打印前面存储到变量student中的名字(见❸)。这样,对于列表中的每个名字,Python都将重复执行❷处和❸处的代码行。你可以这样解读这些代码:对于列表students中的每位学生,都将其名字打印出来。输出很简单,就是列表中所有的姓名:

4.2.2 列表的排序
列表的排序是将元素按照某种规定进行排列。列表中常用的排序方法有sort()、reverse()、sorted()。下面介绍如何使用这些方法。
1.sort()方法——对列表进行永久性排序
sort()方法能够对列表元素排序,其语法格式如下:

上述格式中,参数key表示指定的排序规则,该参数可以是列表支持的函数;参数reverse表示控制列表元素排序的方式,该参数可以取值True或者False,如果reverse的值为True,表示降序排列;如果参数reverse的值为False(默认值),表示升序排列。使用sort()方法对列表排序后,排序后的列表会覆盖原来的列表。Python的方法sort()让你能够较为轻松地对列表进行排序。假设你有一个水果列表,并要让其中的水果按字母顺序排列。为简化这项任务,我们假设该列表中的所有值都是小写的。
【示例2】 sort()方法

方法sort()(见❶)永久性地修改了列表元素的排列顺序。现在,水果是按字母顺序排列的,再也无法恢复为原来的排列顺序:

你还可以按与字母顺序相反的顺序排列列表元素,为此,只需向sort()方法传递参数reverse=True。下面的示例将水果列表按与字母顺序相反的顺序排列:

同样,对列表元素排列顺序的修改是永久性的:

2.sorted()方法——对列表进行临时排序
要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted()。函数sorted()让你能够按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序。下面尝试对水果列表调用这个函数。
【示例3】 sorted()方法

我们首先按原始顺序打印列表(见❶),再按字母顺序显示该列表(见❷)。以特定顺序显示列表后,我们进行核实,确认列表元素的排列顺序与以前的相同(见❸)。

注意,调用函数sorted()后,列表元素的排列顺序并没有变(见❹)。如果你要按与字母顺序相反的顺序显示列表,也可向函数sorted()传递参数“reverse=True”。
注意
在并非所有的字母都是小写时,按字母顺序排列列表要复杂些。决定排列顺序时,有多种解读大写字母的方式,要指定准确的排列顺序,可能比我们这里所做的要复杂。然而,大多数排序方式都基于本节介绍的知识。
3.reverse()方法——反转列表元素排列顺序
要反转列表元素的排列顺序,可使用方法reverse( )。假设水果列表是按购买时间排列的,可轻松地按相反的顺序排列其中的水果。
【示例4】 reverse()方法

注意,reverse()不是指按与字母顺序相反的顺序排列列表元素,而只是反转列表元素的排列顺序:

方法reverse()永久性地修改列表元素的排列顺序,但可随时恢复到原来的排列顺序,为此只需对列表再次调用reverse()即可。
4.2.3 列表的查找
1.使用index()查询具有特定值的元素位置
如果想知道等于某一个值的元素位于列表的什么位置,可以使用index()函数进行查询:

2.使用in判断值是否存在
判断一个值是否存在于给定的列表中有许多方式,其中最具有Python风格的是使用in:

同一个值可能出现在列表的多个位置,但只要至少出现一次,in就会返回True:


如果经常需要判断一个值是否存在于一个列表中,但并不关心列表中元素之间的顺序,那么使用Python集合进行存储和查找会是更好的选择。
3.使用len()获取长度
len()可以返回列表长度:

使用函数len()可快速获悉列表的长度。在下面的示例中,列表包含4个元素,因此其长度为4:

在你需要完成如下任务时,len()很有用,注意Python计算列表元素数时从1开始,因此确定列表长度时,你应该不会遇到差一错误。
4.使用count()记录特定值出现的次数
使用count()可以记录某一个特定值在列表中出现的次数:

4.2.4 技能训练
上机练习7列表的排序
需求说明
想出至少5个你渴望去旅游的地方。将这些地方存储在一个列表中,并确保其中的元素不是按字母顺序排列的。
➢ 按原始排列顺序打印该列表。不要考虑输出是否整洁的问题,只管打印原始Python列表。
➢ 使用sorted()按字母顺序打印这个列表,同时不要修改它。再次打印该列表,核实排列顺序未变。
➢ 使用sorted()按与字母顺序相反的顺序打印这个列表,同时不要修改它。再次打印该列表,核实排列顺序未变。
➢ 使用reverse()修改列表元素的排列顺序。打印该列表,核实排列顺序确实变了。
➢ 使用reverse()再次修改列表元素的排列顺序。打印该列表,核实已恢复到原来的排列顺序。
➢ 使用sort()修改该列表,使其元素按字母顺序排列。打印该列表,核实排列顺序确实变了。
➢ 使用sort()修改该列表,使其元素按与字母顺序相反的顺序排列。打印该列表,核实排列顺序确实变了。
上机练习8商品价格区间设置与排序
需求说明
在网上购物时,面对琳琅满目的商品,如何快速选择适合自己的商品呢?为了能够让用户快速地定位到适合自己的商品,每个电商购物平台都提供价格排序与设置价格区间的功能。
假设现在某平台共有10件商品,每件商品对应的价格如表4-2所示。
表4-2 商品价格

用户根据提示“请输入最高价格:”和“请输入最低价格:”分别输入最高价格和最低价格,选定符合自己需求的价格区间,并按照提示“1.价格降序排序(换行)2.价格升序排序(换行)请选择排序方式:”输入相应的序号,最终将排序后的价格区间内的价格全部输出。
编写程序,实现以上描述的设置价格区间和价格排序的功能。