![Python程序设计教程(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/531/34752531/b_34752531.jpg)
4.1.1 列表list
列表是Python中最基本的数据结构,是最常用的Python数据类型。列表将由若干数据作为元素的序列放置在一对中括号中,元素之间以逗号分隔。Python列表元素可以由任意类型的数据构成。同一列表中各元素的类型可以各不相同。列表中的元素允许重复。此外,Python列表是可以修改的,修改方式包括向列表添加元素、从列表删除元素以及对列表的某个元素进行修改。
1. 列表创建
列表的创建,即用一对中括号将以逗号分隔的若干数据(表达式的值)括起来。下面是几种创建列表的例子:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image974.jpg?sign=1738968934-jT10Bnw2EtTfJxo03xIJkGrGhl28kN6J-0-cea50e9be0e72c639a1fa82ceb5a2a53)
在Python中,经常用到列表中的列表,即二维列表。这种情况下,列表中的元素也是列表。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image975.jpg?sign=1738968934-d9yoO6d6phlSxJhQspcYs8ljAqaHAQXh-0-b03ff4e7b03389b533082b27aff8aba7)
2. 列表访问
列表访问,也就是对列表的索引操作的过程,并返回索引位置上的元素。列表中的每个元素被关联一个序号,即元素的位置,也称为索引。索引值从0开始,第二个是1,以此类推,从左向右逐渐变大;列表也可以从后往前,索引值从-1开始,从右向左逐渐变小。该访问方式适用于所有序列类型的对象:列表、元组、字符串。序列的访问如图4.1所示。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image973.jpg?sign=1738968934-XcOUAIo5jTkwTEASdLEqzh2lxJpv6r7d-0-e4bcf87ca6d6fb00841a9dd0f41e2352)
图4.1 序列中元素的访问
1)一维列表的访问
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image976.jpg?sign=1738968934-By7S221B1sk3BCDKvssqNrEMdxvTUZcV-0-d7f79da6a9678e35c7f41479a03fe90f)
列表的索引操作,如果索引超出了范围,则会导致出错。
另外,列表vehicle有4个元素,正向访问列表vehicle的合法索引范围是0~3,逆向访问列表vehicle的合法索引范围是-1~-4,其中vehicle[0]和vehicle[-4]、vehicle[1]和vehicle[-3]、vehicle[2]和vehicle[-2]、vehicle[3]和vehicle[-1]访问的元素相同。我们可以看出,若一个列表有n个元素,则访问元素的合法索引范围是-n~n-1,当序号x为负时,表示从右边计数,其访问的元素实际为序号为n+x的元素。这个规律对所有序列类型均有效。
2)二维列表的访问
对二维列表中的元素进行访问,需要使用两对中括号来表示,第一个表示选择子列表,第二个在选中的子列表中再选择其元素。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image977.jpg?sign=1738968934-8cmlBecLPzfuGvxq6FdbG2gGi1PmITeu-0-b4967b1037e94ff9cd7aefa75b125ab8)
3. 修改元素
列表中的元素可以通过重新赋值来更改某个元素的值,要注意列表元素的合法索引范围,超过范围则会出错。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image978.jpg?sign=1738968934-G7XjalUG7tjrEBNn3euwgnrmyf5zz9z7-0-3f7ad865bfc0cd2a737d323773e9a261)
4. 列表切片
在列表中,可以使用切片操作来选取指定位置上的元素组成新的列表。简单的切片方式为:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image979.jpg?sign=1738968934-fqjIe6noRv7fE7TPcJzRkqHCrpdSYEmd-0-1f18465742180ac5cad7f584307d0016)
需要提供开始值start和结束值end作为切片的开始和结束索引边界。开始值start索引位置上的元素是包含在切片内的,结束值end索引位置上的元素则不包括在切片内;当切片的左索引start为0时可默认,当右索引end为列表长度时也可默认。这个简单的切片操作从原列表中选取索引位于[start,end)区间内的元素组成新的列表。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image980.jpg?sign=1738968934-3y1Dtv8Cd6FvP8d6iwUsRSDRPDkoGEg5-0-3cf61a68c2a218e1d1ed6729095781cc)
当然,对列表切片操作时,也可以使用负数作为索引。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image981.jpg?sign=1738968934-47bpRAAXDcmKNwlGvuFAPtrlzjZe6MPY-0-bbf7dc1b0ba5f394e1abe743a32f2726)
以上列表切片操作都是获取索引值位于[start,end)区间内的连续位置上的元素组成新列表。也就是切片选取元素时,索引值每次增长的步长为1。其实,切片操作也可以提供一个非零整数(即可正可负,但不能为0)作为索引值增长的步长step值。使用方式为:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image982.jpg?sign=1738968934-cK4C5vzlYFFI5hXVh2NYYzhKyzKi40zH-0-8f05ff63b3388dafa91fa2a0e5542b92)
当步长为1时,step参数可以省略。前面列表的切片操作步长均为1,所以可以省略步长。当步长step不为1时,该参数不可省略。切片操作适用于所有序列类型。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image983.jpg?sign=1738968934-bER72UIOSV9xEGNdEcBCVeY2bbmqMpts-0-50d74ce3df075730604325b4fa5bdfc2)
当切片开始值与结束值均省略,且步长step大于0,表示在整个原列表范围内,切片索引从第0个位置开始,每次增长step,直到超过原列表的索引范围。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image984.jpg?sign=1738968934-Dnejt3Uc6FkFr9Z9nXUpAYYLOQ8OVvDL-0-8108cb290708b68d32007a614b541a9c)
另外,利用切片还可以更改元素值。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image985.jpg?sign=1738968934-Ci9ZZbRhyO3CamuyHh5cviw3fchXDEWN-0-e38eb3c4c648d51e976d0cb94427f67b)
5. del命令
使用del命令可以从列表中删除元素,也可以删除整个列表。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image986.jpg?sign=1738968934-YRo8vSnScoVklvK66X5oMb4J5CLT6yZw-0-f8da9e058d72d996e95d9cfea3ead644)
另外,remove()、pop()、clear()方法均能实现列表元素的删除,请参考下面介绍的列表方法。
6. 列表运算
1)列表相加
通过列表相加的方法生成新列表。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image987.jpg?sign=1738968934-MoxtulzFLILxlzABFMYsEZrddM5AIIv6-0-1f576448395cdd3123e4e58819107faa)
2)列表相乘
用数字n乘以一个列表,会生成一个新列表。在新列表中原来列表的元素将被重复n次。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image988.jpg?sign=1738968934-FRSCnHxFS8QWILOy5HnOBmvRCEnSH8i7-0-e4db3c85b68449e6c560a026e0a72124)
7. 列表方法
列表中的方法可看作是作用于Python中列表这一特定类型对象的函数。
1)index(value[,start=0[,stop]])
index()方法用于从列表中找出与value值匹配的第一个元素索引位置。如果没有指定参数start的值,则从索引为0的位置开始查找,否则从索引为start的位置开始查找。如果没有指定结束索引位置stop的值,可以查找到列表最后元素,否则在位于[start,stop)内的索引区间查找。如果找不到匹配项,就会引发异常。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image989.jpg?sign=1738968934-Z05ifvZSiihJVfUDqRKYuYE9KR9cqsR3-0-c2820be7e1f08115105ad826f6f6d6b1)
实际上可以先使用in运算符测试某个元素是否在该列表中,避免用index()查找索引位置时由于找不到指定元素而导致的错误。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image990.jpg?sign=1738968934-r9TB5oHNHZLXCbIqp6iRCfV6RMZcNK9c-0-94869e3b41fb2e9c77bec476bafb199e)
2)count()
count()方法,用于统计某个元素在列表中出现的次数。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image991.jpg?sign=1738968934-7iEzAlZa3soBO5vXPqlTNKw9XefSUvZ5-0-052b09484529a185510b343a51e0703d)
添加列表元素除了前面介绍的“+”“+=”“∗”“∗=”运算符以外,还有append()、extend()、insert()方法。
3)append()
append()方法,追加单个元素到列表的尾部,只接受一个元素,元素可以是任何数据类型,被追加的元素在列表中保持着原结构类型。例如:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image992.jpg?sign=1738968934-96Gpxm7KaafMxvKwjfoYYnGPzWjUUQl2-0-3df2a9325c2ab2cccdad42f1a1f92050)
4)extend()
extend()方法,在列表的末尾一次性追加另一个列表中的多个值,可以用新列表扩展原有的列表。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image993.jpg?sign=1738968934-UThYhUjsgxCcEiWLRj7SvZBmQy3v7uXT-0-7af8319c2e60481a6bde0de4ca0487cc)
5)insert()
insert()方法,将一个元素插入到列表中的指定位置。列表的insert方法有两个参数,第一个参数是索引点,即插入的位置,第二个参数是插入的元素。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image1.jpg?sign=1738968934-qvl0KuKfpZehj8u7NoCC6RoqUmpVmMOS-0-3ed3c514e07506eaff6fd9a649f4c838)
删除列表元素除了前面介绍的del命令以外,还有remove()、pop()和clear()方法。
6)remove()
remove()方法,用于移除列表中与某值匹配的第一个元素。如果找不到匹配项,就会引发异常。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image2.jpg?sign=1738968934-5WPOKxgPms1Yt9G3PJvkrYA3DVsszLab-0-3bf38bb832563db34890b74eba2527da)
7)pop()
pop()方法用于移除列表中的一个元素(默认为最后一个元素),并且返回该元素的值。pop()方法可以指定索引位置,当不在索引范围内或者从空列表中使用此方法均会触发异常。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image3.jpg?sign=1738968934-zw0N6b1pKfYAt3iFZWYEeOB6NSdPef8z-0-45aac3122d2442217e4be260e12c42c0)
8)clear()
clear()方法用于删除列表中所有元素,但保留列表对象。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image4.jpg?sign=1738968934-B8S4R2ZRRvthICS8iVRkA3AA5dCThS7Y-0-02f68d19cb54ad231e73b439ab5bf159)
请注意与del命令的区别,del命令删除整个列表时,列表对象不再保留。
列表排序有reverse()、sort()方法,还有reversed()、sorted()函数,函数的用法请参看列表函数部分的介绍。
9)reverse()
reverse()方法,用于将列表中的元素位置反向存放。列表中可以有不同类型的元素,reverse()方法只是将位置反转。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image5.jpg?sign=1738968934-O3neMgTE9xi6AqZYeasuGwdEIMaId4vC-0-28b9aec826091aff185f61dd28067103)
10)sort()
sort()方法,用于将列表中的元素进行排序。默认按升序排列。使用reverse参数来指明列表是否降序排列,参数是简单的布尔值True或False,若其值等于True表示降序排序,默认为False。如果列表中包含的是字符串,按字母排序规则排序。可以使用key参数。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image6.jpg?sign=1738968934-qRaU6pHpt8UMYP2kY1asQdNnW84CmHuM-0-101b6d65016a04bbc2e89db12237e736)
8. 列表函数
1)len()函数
len()函数,用于返回列表中所包含元素的个数。例如:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image7.jpg?sign=1738968934-Gh58QmrfgNTZ7CvbjS1ZLMB9vXUdqwYS-0-c6e37513f059d77998bc5ae8e861511f)
2)max()函数
max()函数,用于返回列表中元素的最大值。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image8.jpg?sign=1738968934-Ta9KvQ924NGchmPYxm07n9o7bGPvIQ9I-0-3c4fcc368fb2c37deeee3c42837edd0c)
如果列表中包含的是字符串,按照字符串的比较大小方法排序返回最大值。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image9.jpg?sign=1738968934-FPspgYYT9UkGfS21iqskHnFrSafN9wNZ-0-d0c933273017c3cd422d62e0beb0cc5b)
列表中只能包含可相互比较的元素,如列表元素中既有数字又有字符串则会出错。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image10.jpg?sign=1738968934-RZ51AfKzINL1M90mByqRQobflsN0fQBC-0-56363c671eae186241414a9e26545344)
3)min()函数
min()函数,用于返回列表中所包含元素的最小值。同样,如果列表中包含的是字符串,也按字符串的比较大小方法排序返回最小值,列表中只能包含可相互比较的元素。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image11.jpg?sign=1738968934-rTXpHsGbw8pQTOieLjTH4TI9BAGhNfHl-0-1dde1ca540d2ba8068ec7233dd287f3f)
4)reversed()函数
reversed()函数,将列表中的元素位置反向并返回可迭代的reversed对象。可以和list()函数联合起来使用得到列表。例如:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image12.jpg?sign=1738968934-0lHKpL1Xkeb85dYJUqfG1OToQOTpoWaw-0-b1e1c84605634c3262832203d7306cd6)
5)sorted()函数
sorted()函数,对列表进行排序并返回新列表。例如:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image13.jpg?sign=1738968934-XwJ78gfNpqoAt3OAG0IgusgezMyQ0rIH-0-7c4631f55b5cc29b5b3a671d9f4e39b6)
思考:请比较sorted()函数和sort()方法的异同。
9. 列表遍历
可以通过for语句或者while语句循环遍历列表中所有元素。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image14.jpg?sign=1738968934-Yy0g9Tkhd4MPudIPqOVH5ayCy2gB97kk-0-4531e515d735b5013804786b124715fa)
【例4-1】 给定一个由10个整数值构成的列表[10,9,8,7,6,5,4,3,2,1],编程只对列表中下标为偶数的元素进行升序排列。
程序代码:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image15.jpg?sign=1738968934-IW9jXg1rPqtg95GJKAVQnBu1hEEw8NHO-0-ccab9f22b8d06d77b0d1f0ccdf6cde83)
程序运行结果:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image16.jpg?sign=1738968934-qf6DGrP1EtD4sKsLhpQRjcxhzo9qFEby-0-6afb6278d1cb5ff75b46262b0276ed8c)
【例4-2】 用户分别从键盘输入4个整数和3个整数组成两个列表list1和list2,将列表list2合并到list1中,并在list1末尾再添加两个数字90和100,然后对list1降序排列,最后输出最终的列表list1。
程序代码:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image17.jpg?sign=1738968934-U8PP1tdibXbbTqE48MTLEmXptpa7jjQx-0-958ce6305ebb20ac7a5f27c45586ffcf)
程序可能的一次运行结果:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image18.jpg?sign=1738968934-BM0nyeAiWiJgIN72ONxRdnezwkcdFVXA-0-b4958cfc0de72b80afe78db1319aca4e)
思考1:列表list2合并到list1中可以用此语句list1=list1+list2实现吗?
思考2:在list1末尾再添加两个数字90和100可以用append吗?如果可以,如何实现?
思考3:如果是通过键盘输入两个数字添加到list1末尾程序如何实现?
例如在上例中,程序改为通过键盘输入两个数字90、100添加到list1末尾,程序可以写成:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image19.jpg?sign=1738968934-YBSDc0uA1F6wsaf2lI3c0ngBStJ5uyBR-0-011b052e3e514f62cb5ef00acdbc0a90)
【例4-3】 某公司股票近一段时间的收盘价(单位:元)分别为:12.04,11.15,13.47,13.58,12.04,12.04,11.15,12.58,11.15,请建立一个列表(data)存储这些数据。请编写程序解决如下问题:
(1)上述一共有几个数据?
(2)统计收盘价为12.04元的次数;
(3)找出收盘价中的最小数据,并删除首次出现的最小数据,最后显示列表data。
程序代码:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image20.jpg?sign=1738968934-9eOiUksrpx51IKgn0QivxIhK87VVIncN-0-a4769a8badeda309b2b89fe7f05fe09b)
程序运行结果:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image21.jpg?sign=1738968934-YaAWpBVoPUrLHg4YdJVobIdC4UwZKkz5-0-359f653e5c5484fa967d878a97ffae20)
思考:如果要删除所有出现的最小数据,程序如何实现?
第1种方法:
程序代码:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image22.jpg?sign=1738968934-iQRCaKoaRmeoJG1Dko37aSQ5Po5XirJS-0-9eb4e4816fd3563c4c5fd55a5a3f12ba)
程序运行结果:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image23.jpg?sign=1738968934-86XCSf3aBFCSb7ngetkpXZFQz1vz0DyK-0-a7fa11e13209766b2d13df8c43c6dead)
第2种方法:
程序代码:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image24.jpg?sign=1738968934-sgvDU6oJhtJj2xrebalVvpJVeIyPUWt2-0-d3d4dfb4812dc8c59490da662ee63455)