![代替VBA!用Python轻松实现Excel编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/254/43738254/b_43738254.jpg)
1.5 列表
列表是可修改的序列,可以存放任何类型的数据,用“[]”表示。列表中的元素用逗号分隔,每个元素按照先后顺序有索引号,索引号的基数为0。在列表创建以后,可以进行索引、切片、增删改查、排序等各种操作。
1.5.1 创建列表
创建列表有多种方法。
1. 使用“[]”创建列表
使用方括号“[]”直接创建列表。下面创建一个没有元素的列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/037-3.jpg?sign=1739285910-iLPedYJj9bDvkaGPCwY4sI3oNLt0Axqv-0-4020613f710547debc808116e85c41b9)
创建一个元素为一组数据的列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/037-4.jpg?sign=1739285910-MDtPz3O997menTrRo0kHeerFNqV1NxGA-0-d7b934f50d00cf89a2af206693084951)
创建一个元素为一组字符串的列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/037-5.jpg?sign=1739285910-vNVSt7lqHJGP3CVohfMpOBdzgiifptOm-0-dcb491d8b17b55cac6f1cbabf517395d)
列表元素的数据类型可以不同。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-2.jpg?sign=1739285910-IbLqQaQ56aUQGl9o3EOg9nI4OemjLA0x-0-d158b2c7a2a8ee8ddfbe7d8d521149d5)
列表的元素也可以是列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-3.jpg?sign=1739285910-NIDHb3MxArph79G4NG2pasU9gqUirTBr-0-048fcb28be9e85cd6e05fbf11af467f1)
2. 使用list函数创建列表
使用list函数能将任何可迭代的数据转换成列表。可迭代的数据包括字符串、区间、元组、字典、集合等。
当list函数不带参数时将创建一个空的列表,例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-4.jpg?sign=1739285910-dbdZsIjyWJ3hIzuE9cfi8M8LTtZWJZvI-0-18e9758b5e50f3d0023daa4ca53f0823)
(1)把字符串转换为列表
当list函数的参数为字符串时,将该字符串转换为元素由字符串中各字符组成的列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-5.jpg?sign=1739285910-P0pQkHFwmnfinfja6wTvKeScjJ8osNXJ-0-d56f52bd5f31987cad451442845508fa)
(2)把区间对象转换为列表
使用range函数创建一个区间对象,该对象在指定的范围内连续取值。range函数可有1个、2个或3个参数。当有3个参数时指定区间的起点、终点和步长,比如从2开始,每隔两个数取一次数,取到10为止。当有2个参数时指定起点和终点,步长取1。当有1个参数时指定终点,起点取0,步长取1。
下面是range函数只有1个参数的情况。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-6.jpg?sign=1739285910-XGDenE4x9syBZTiFdu1tYEl3vTiPr2Mf-0-3c21629bc478d939e142ebe18d00a0b5)
生成的区间对象从0开始,以1为间隔连续取8个值,即0~7。所以,从表面上看,虽然range(0, 8)定义的区间终点为8,但实际上不包括8,这习惯上称为“包头不包尾”。使用方括号和索引号可以获取区间对象的值。例如,下面的代码获取区间第1个值和最后1个值。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-1.jpg?sign=1739285910-yMiHfv8x5mfxdlRZqiaN1kLyKE6BYbrK-0-62865b7aab22d6f4b64c43e5ddef8400)
下面是range函数有3个参数的情况,在0~9范围内每隔两个数取一次数。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-2.jpg?sign=1739285910-CKnAyb3LnBHTimspKkqZJJBNDp7de5UU-0-5cd8e12e83738c1c40f74fad21de1d9c)
通过索引获取区间前两个数:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-3.jpg?sign=1739285910-plHUWHetsj3puZQtZs1GV8MDS2fhUWxO-0-dd12e2f0077f9b9f4ccbb86c8774dadc)
可见,相邻两个数之间的间隔为2。
将区间对象作为list函数的参数可以创建列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-4.jpg?sign=1739285910-suTRZvjdWu7GeTk6Hy1hEhl7tC3a3KRL-0-602a21cdf73357947dd0fcb4df2b09ed)
(3)把元组、字典和集合转换为列表
使用list函数也可以把元组、字典和集合等可迭代对象转换为列表。关于元组、字典和集合,将在接下来的各节中陆续介绍,这里先看操作效果。
将元组转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-5.jpg?sign=1739285910-aRrjH25WNkOE9ANv0tuOejtC48u61iVl-0-aa85d4e02de8551fbabb06240964f7bf)
将字典转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-6.jpg?sign=1739285910-JQqJd4WBqjEbjRsBuE1AvI3yLQgTIXSE-0-04e0380e9a149face861ec1335fca264)
将集合转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-7.jpg?sign=1739285910-ashPJHgcaH2QIAxApyJs5o5lhiDiI6sn-0-46779c72fb4c4cba27be49c82a997964)
3. 使用split方法创建列表
对于字符串,使用其split方法可以按指定的分隔符进行分割,分割的结果以列表的形式返回。
下面给定一个字符串,使用split方法,用默认的空格分隔符进行分割,返回一个列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-1.jpg?sign=1739285910-aJc8BhXoA8noF0EjbISLFpfTHdPUzBYH-0-1f12e6cb75cfca3c8d3f06afabda4c68)
4. 深入列表
列表中的每个元素都引用一个对象,每个对象都有自己的内存存储地址、数据类型和值。各元素保存对应对象的地址。
下面创建一个列表,用id函数获取列表中各元素引用的对象的地址。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-2.jpg?sign=1739285910-HLUambbaFqvy3TW0Kf6bVh7mv7fFweeh-0-1518a98e8557636495a8a70de686e9af)
可见,各元素引用的对象的地址各不相同,它们是不同的对象。
1.5.2 添加列表元素
在列表创建以后,可以使用多种方法向列表中添加元素。
1. 使用append方法
使用列表对象的append方法在列表尾部添加新的元素。该方法的执行速度比较快。下面创建一个列表,然后用append方法添加一个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-3.jpg?sign=1739285910-5VEAI5CIyX7flgUOTkUpXhzN0RIzqeha-0-313567f4d20e839be4093453c1f7f124)
2. 使用extend方法
与append方法一样,使用extend方法也是在列表尾部添加新的元素。与append方法不同的是,它在列表末尾一次性追加另一个序列的多个值,所以它更适合列表的拼接。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-4.jpg?sign=1739285910-1GqJRinHPQWLiGjWB8aOfpHyEXIUvi75-0-ba8ebc1a62ebadae61c034772674397d)
extend方法的参数还可以是字符串、区间、元组、字典和集合等可迭代对象。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-3.jpg?sign=1739285910-lEpXqZFTgW7RN7qQ0bIXC0abprlVIqS6-0-ac858ede77d5cc81bb6cf9b329e691c5)
3. 使用insert方法
使用列表对象的insert方法,可以在指定位置插入指定元素。该方法有两个参数,其中第1个参数指定插入的位置,指定一个索引号,即在它对应的对象前面插入新的对象,索引号的基数为0;第2个参数指定插入的对象。
下面创建一个有4个元素的列表,使用列表对象的insert方法在第4个元素前面插入新对象5。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-4.jpg?sign=1739285910-l20fRoxqibxlx6HereQLADe3P9HzyoO6-0-c0da20214a9573bb49dea73fc3a1c7ce)
4. 使用运算符
使用+(加号)可以将两个列表连接起来,组成一个新的列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-5.jpg?sign=1739285910-FHWaMRVHL5x2ooZ0q7qXQTFGxwofLi2m-0-8758f5f8392165103dca76d623044dd2)
使用乘法扩展,可以将原有列表重复多次,生成新的列表。下面创建一个有2个元素的列表,将它扩展3倍,生成新的列表b。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-6.jpg?sign=1739285910-KgSHfEpab4Ia4ziVxW8O0A2Xxem84ynW-0-6835f7d561c2ea51af36f4366e28043a)
1.5.3 索引和切片
在创建列表并向列表中添加元素后,如果希望获取列表中某个或某部分元素并对它们进行后续操作,就要用到索引和切片。索引一般是指访问列表中的某个元素,切片则是指连续访问列表中的部分元素。
使用“[]”进行列表索引操作,方括号中为要索引的元素在列表中的索引号。从左到右索引时,索引号的基数为0;从右到左索引时,索引号的基数为-1。
下面创建一个列表ls。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-1.jpg?sign=1739285910-fjcGZ9S8125iVBsMIK2Qkr6JYvktqH6I-0-d11b1c4ebfc5185ed8d6b6189eb28b1a)
通过索引获取列表中的第3个元素:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-2.jpg?sign=1739285910-eDkSNg65OabY1hPPqyxFpEoFxeQfwTaG-0-0d37370846251423607b3dbbead2e554)
获取列表中倒数第2个元素:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-3.jpg?sign=1739285910-7Is9d36emDtCgLjACsLyOlUPOqnrAnDZ-0-dee902056a571362f77d1f5cd3d0d2ee)
使用index方法可以获取指定元素在列表中首次出现的位置。语法格式为:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-4.jpg?sign=1739285910-wLwGpezO90phKiRZl7J6XbdeNo6oZW6N-0-620ac2d7468db59b547557dc4a985e2e)
其中,value为指定的元素,start和end指定搜索的范围。
下面创建一个列表a。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-5.jpg?sign=1739285910-8SzjyATvXVKZs5z1zbZLx6QunYwWZ9Ik-0-dec3f582583f88d90372c7d1c5bd2fb9)
获取元素2在列表中第一次出现的位置,注意位置索引号的基数为0:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-6.jpg?sign=1739285910-aRYT5YfuuIW5c6HzG9d3JyPWge61nsWW-0-b64bd369afacc56edabe3dd919efb558)
从第3个元素开始到最后一个元素,在这个范围内获取元素2第一次出现的位置:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-7.jpg?sign=1739285910-XwBGw5L3P41yYJdBItWDUA7m9GD0fyPF-0-a110bebae1c93860285ac9fa597d0615)
切片操作从给定的列表中连续获取多个元素。常见的列表切片操作如表1-9所示。切片操作完整的定义是[start:end:step],取值范围的起点、终点和步长之间用冒号分隔。这3个参数都可以省略。注意“包头不包尾”原则。
从左往右切片时,位置索引号的基数为0。当省略start参数时,起点为列表的第1个元素;当省略end参数时,终点为列表的最后一个元素;当省略step参数时,步长为1。
从右往左切片时,位置索引号的基数为-1。各参数的值都为负,数字的大小为从右边往左边数数的大小。比如最后一个元素的索引号为-1,倒数第2个为-2,依此类推。
表1-9 列表的切片操作
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-1.jpg?sign=1739285910-UAlleXqkMGuKqqgNCSHNrFJ628TM02FN-0-0b6af7c60cc2ebe3859ad6675d772243)
1.5.4 删除列表元素
在Python中,可以使用多种方法删除列表元素。
使用列表对象的pop方法可以删除指定位置的元素,如果没有指定位置,则删除列表末尾的元素。
下面创建一个列表,用其pop方法删除最后一个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-2.jpg?sign=1739285910-Fwf7C4licxEohiRHUGaCsjKKWwdgA2R4-0-a1535dff449848b4f1bf1525893a2083)
继续删除列表中的第3个元素。注意,位置索引号的基数为0。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-3.jpg?sign=1739285910-ZnW1woAdHOXHO8RE0vx91SXCE4tJ21U4-0-545de82a4cb5971869cc001a758133a7)
使用del命令删除指定位置的元素。下面删除列表中的第4个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-4.jpg?sign=1739285910-x4CbmDIkEg2Ia9Vy9sWizQcQWUVXtsPm-0-3f7f62f3dd7ce638788fff89b042b5b0)
pop方法和del命令都是使用索引删除列表元素的,使用remove方法可以直接删除列表中首次出现的指定元素。下面从列表中直接删除第1次出现的元素3。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-5.jpg?sign=1739285910-sPZRiXgVxritUr143wbLOKYyrIG9icuN-0-90834b5191a855c4c09260c6c1dfd80e)
如果指定的元素在列表中不存在,则返回出错信息。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-1.jpg?sign=1739285910-ZELq50hglfPQQbdxhxkbU4B7BDv6OffD-0-0ec7e540273abeaf9e2ebd10fae83750)
1.5.5 列表的排序
使用列表对象的sort方法可以对列表中的元素进行排序。默认从小到大排序,不必设置方法参数。下面创建一个列表,使用sort方法将列表元素从小到大进行排序。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-2.jpg?sign=1739285910-CbyXHujWN9zlrNI0SpSJXlwnX6IIcoMP-0-b5d58c1fb70c59c6d59c0497a193571c)
设置sort方法的reverse参数的值为True,对列表中的元素按照从大到小的顺序进行排列。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-3.jpg?sign=1739285910-L2S17ZWdcN1NkRNU9ewATagIVdMngk6n-0-4f526100569463671ce655ee13deb5d9)
还可以使用Python的内置函数sorted进行排序。该函数不对原列表进行修改,而是返回一个新的列表。设置该函数的reverse参数的值为True,将列表元素进行降序排列。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-4.jpg?sign=1739285910-68X9YzoQYRrLft5cb3FCxF05coqyJtv4-0-8cdb30602e1abbdd7614c22a9d99c7ac)
1.5.6 操作函数
使用len函数获取列表的长度。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-5.jpg?sign=1739285910-jn7fUXmZhlLT3nlB0jMvtwRWR8JEZ8vE-0-3b2db9ebd745beb0ee4cc68a29c8548c)
使用列表对象的count方法指定元素在列表中出现的次数。下面创建一个列表,计算元素2在列表中出现的次数。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-6.jpg?sign=1739285910-Og4PyKgXf2lE6dSf0tiIDg7BO1sCnpND-0-55747e97d8c96b39906e6c2caca04fcf)
使用成员运算符in或not in判断列表中是否包含或不包含指定元素,如果是则返回True,否则返回False。下面判断给定列表中是否包含元素1,是否不包含元素4。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-1.jpg?sign=1739285910-MUXFHzUalJSLFlg5fH5VGhBHe5yLcW7e-0-d065b6199ebe04494af9bc5144a6090c)
在使用print函数对列表数据进行格式化输出时,使用索引获取列表的元素。下面创建一个列表,然后使用print函数进行格式化输出。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-2.jpg?sign=1739285910-VoCDLtC3RzqamEMY2Ij5OAlNxBtA8sRz-0-0e0581c135ba468d8c19aeae1b30a8de)
1.5.7 二维列表
通过列表嵌套可以创建二维或多维列表。二维列表有两层方括号,即列表的元素也是列表。下面创建一个二维列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-3.jpg?sign=1739285910-eS28NZh56gJdo01mt5yQvJKvnq0fXS6e-0-13e9628924fd485e272d66e67914a54a)
对二维列表进行索引和切片时,要指定行维和列维两个方向上的索引号或取值范围。注意,基数为0。
下面获取二维列表中第2行第3列元素的值。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-4.jpg?sign=1739285910-v1sZtCVTH7mcxY0zHGJQMh98Yz56uSG0-0-c25cd6b7d06e15150463a8058e53917d)
对于二维列表的切片,首先要明白a[1]和a[1:2]之间的区别。a[1]获取的是二维列表a中的第2个元素,是一个一维列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-5.jpg?sign=1739285910-DCZzlZOWnJRKtyolQ0A7f6Nd8WucOAtp-0-4f4a83fdd0fddda48a309e1923dd6b46)
a[1:2]获取的则是一个二维列表,即:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-6.jpg?sign=1739285910-6dWSxmhMF6bodOophJo8sWvNZwkAjy07-0-a7a71c70cb744f2b5fc16c8ba4d310c6)
然后就比较好理解下面的结果了:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-7.jpg?sign=1739285910-2luPpkd6TG2XuLjau3yb1JPArG9lqDPZ-0-b593900439b8c0018277b5d84ac378d8)
以及
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/046-1.jpg?sign=1739285910-sFPPQPCldDJQh57UA1rU7SrYADKuuwVo-0-9fb12e04544c1db966e1eda1c815effd)
请反复比较和理解它们之间的差别。