![数据结构与算法(Python版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/974/41864974/b_41864974.jpg)
3.6 列表
3.6.1 列表的概念
列表(List)是Python中使用最频繁的数据类型。列表中的每一个数据称为元素,元素用逗号分隔并放在一对中括号“[]”中,列表可以认为是下标从零开始的数组。列表可以包含混合类型的数据,即在一个列表中的数据类型可以各不相同。
列表举例如下。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_43_02.jpg?sign=1739282832-Ah4KB3kXGtEqmBoQyCZ9pAaMsIcxBs0v-0-47eeb9728f92a8e80f2a1f960674e673)
Python创建列表时,解释器在内存中生成一个类似数组的数据结构,数据项自下而上存储,如图3.10所示。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_43_03.jpg?sign=1739282832-iww6LKsVI8x9eQB6rHCFNf8b54faGl5c-0-8740cd8975966dde88d775278465909b)
图3.10 列表存储方式
3.6.2 列表的操作
下面介绍列表操作。
(1)创建列表
使用“=”将一个列表赋值给变量。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_43_04.jpg?sign=1739282832-qnnjfGGDQLd5FI55UuENwWWAWLPai6bO-0-a517a5c79e9f430700d0ad075b4e78a6)
(2)读取元素
1)读取某个元素:用列表名加元素序号读取某个元素。
序列中的每个元素被分配一个序号——即元素的位置,也称为索引。从左至右依次是0,1,…,n,从右向左计数来存取元素称为负数索引,依次是-1,-2,…,-n。li[-n]==li[len(list)-n]。
【例3-9】列表索引举例。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_44_01.jpg?sign=1739282832-dGB7zyI5AjaUiLUtjvILc9nC7WK7iqMo-0-68b24d882caba83b6b1391eee0fbcdf2)
注意:Python从0开始计数。
2)读取若干元素。
序列切片(Slice)是指使用序列序号截取其中的任何部分从而得到新的序列。切片操作符是在[]内提供一对可选数字,用冒号分割。冒号前的数表示切片的开始位置,冒号后的数字表示切片的截止(但不包含)位置。
注意:记住数是可选的,而冒号是必须的;开始位置包含在切片中,而结束位置不包含在切片中。
【例3-10】列表切片举例。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_44_02.jpg?sign=1739282832-TwGBXXWyNRb69lRudpffgezqmtgi7dho-0-3ec1e488c53763c7d6de3034666f5ad8)
(3)修改元素
只需直接给元素赋值。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_44_03.jpg?sign=1739282832-BkoPPN4eu29TG8jN1ANtukjUnwHXtVjw-0-86df2e2d5c7da8e3bc11c978938a54cf)
(4)添加元素
列表添加元素有“+”、append()、extend()和insert()方法。
方法1:使用“+”将一个新列表附加在原列表的尾部。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_44_04.jpg?sign=1739282832-dowlbFS6aUCtrLb2aQfhunmBeEwv5944-0-2b17e3d1f0c31f3d08e08acf89711733)
方法2:使用append()方法向列表尾部添加一个新元素。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_44_05.jpg?sign=1739282832-aoGM0iQUJcv902qfB4fuDkzU3r8jcjLx-0-7346dee1a24ce4eaea27de88fff8100b)
方法3:使用extend()方法将一个列表添加在原列表的尾部。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_45_01.jpg?sign=1739282832-EzB7IYGrTJtEVvlGQ57u1fQeUE2X3jl8-0-19c2b5825f5057c6d5b01705cdd8ed96)
方法4:使用insert()方法将一个元素插入到列表的任意位置。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_45_02.jpg?sign=1739282832-EOYNq9DAIRV2pQdpRYjLmJAh5tBiUCgO-0-423209df71d6b09c88c3713c0ad2fdf6)
【例3-11】比较“+”和append()两种方法。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_45_03.jpg?sign=1739282832-16bKaUin9ZWNCFarmB6iszFaBcfQAtQN-0-9b81d5728eaf2a3d3ea731bd0253fda8)
【程序运行结果】
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_45_04.jpg?sign=1739282832-VM3HC8lrYyV3xZeWnnSfETKmHXZUYnUa-0-802c2993256a0a5a6ad8a906d2c59ae4)
从程序结果可知,append()用时较少,明显快于“+”。
【例3-12】比较insert()和append()两种方法。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_45_05.jpg?sign=1739282832-MPHnLTea82cb8fT5Tk4l8Dz99HC4TB6m-0-9a3704e2da4b13f088cb4cdafe9eaed1)
程序运行结果如下所示。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_46_01.jpg?sign=1739282832-0Lzr2PrEtkxeI0kyqPh0GD29jS39q1lG-0-8fa2792030c5fe5941cd83b4bcee3da8)
从程序结果可知,还是append()用时较少,明显快于insert()。
(5)删除元素
列表删除元素有del、remove()和pop(参数)方法。
方法1:使用del语句删除某个特定位置的元素。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_46_02.jpg?sign=1739282832-DXUiSF4g3HQBn5mOAVrUc0FguZonPM5V-0-fcd42365430df7f2231a97baa1c6ac36)
方法2:使用remove()方法删除某个特定值的元素。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_46_03.jpg?sign=1739282832-SNCQukUkN9u5ZZi3OeKxQMR4YQEmHJUy-0-0102cf328f5e839a6e7e197332ab2209)
【例3-13】比较两组代码。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_46_04.jpg?sign=1739282832-zjW72PlcO6EnptJcWxOkMTGiw7JhGaNe-0-a553760a8d923196b2595c84f0672500)
【解析】同样的代码,仅仅是所处理的数据发生了一点变化,却导致结果不同。两组数据的区别在于数据中是否有连续的“1”。由于列表的自动内存管理功能,在插入或删除列表元素时,Python会自动对列表内存进行扩充或收缩并移动列表元素以保证所有元素之间没有空位置,因此,每当插入或删除一个元素后,该元素位置后面所有元素的索引都会改变。
remove()和del都用于删除元素,修改后的代码如下所示。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_46_05.jpg?sign=1739282832-dqip5xdluG8WFWdy4S9e9GQhmkCfDzLV-0-d921d6fa7454346e0cadb309f6b8273f)
方法3:使用pop(参数)方法弹出指定位置的元素,默认参数时弹出最后一个元素。
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_47_01.jpg?sign=1739282832-ng23A38zlyRym97i1VWCiiPV7VJcPoOH-0-ee42973aedea1453ddfb3b716a2859c5)
(6)获取列表中指定元素的下标
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_47_02.jpg?sign=1739282832-0i7RxbrG5PtbYcjY9yvw6ax1CbGITPjK-0-f8c07e8ebeb9f55a2b96337b5cb95695)
列表方法如表3.11所示。
表3.11 列表方法
![](https://epubservercos.yuewen.com/3C8452/21889219301185006/epubprivate/OEBPS/Images/978-7-111-66363-8_47_03.jpg?sign=1739282832-oGvoJc58tAYiGs19nlslghpedJqZVr09-0-5e3cabf2fbb7ad667e69610f80119073)