![代替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=1738887405-v0xKJKBY2CjDL38EMi6yL0Pt8iT95ktn-0-dfe9328078a9aae895937eb1d9488d8d)
创建一个元素为一组数据的列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/037-4.jpg?sign=1738887405-mtdW88yr6no3MPPps4pkg6k222mcrvY0-0-4d3eefa10e26f130dc973b47c0f7c07f)
创建一个元素为一组字符串的列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/037-5.jpg?sign=1738887405-jgFbfJ3vnotXxZlXUeshPuFqL3ljluT7-0-9fc361a6a70be97cf24618af99a94793)
列表元素的数据类型可以不同。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-2.jpg?sign=1738887405-E9TM4EIhBVeOwbg1tqG7h7AAXjuQFzPe-0-0630bd58ebbd52ba9e4119327fe7f175)
列表的元素也可以是列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-3.jpg?sign=1738887405-3qeWJkX9rJGkA7uJRcmAjL1oN89Slcct-0-27afbf7e5b6e4faf61ad71575d43fe35)
2. 使用list函数创建列表
使用list函数能将任何可迭代的数据转换成列表。可迭代的数据包括字符串、区间、元组、字典、集合等。
当list函数不带参数时将创建一个空的列表,例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-4.jpg?sign=1738887405-MX500Me0YiKkr0LxR6EZKCVWrZBbS8jp-0-3982f02710b8bd7568d4b80b1e580375)
(1)把字符串转换为列表
当list函数的参数为字符串时,将该字符串转换为元素由字符串中各字符组成的列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-5.jpg?sign=1738887405-tuSCBzvBfKhA6D9BvcG2WlYxnoHTKOmX-0-65378125b017c6410a98e5a2a08733e3)
(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=1738887405-Us8utn56NcW6hTXuOrM2Uik4MkcMq2tW-0-a01959ffdee3a3821b114c13342efd18)
生成的区间对象从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=1738887405-ZihY1oxg0hwvGdmYx3fcxb5YRK4fSjZ9-0-1e1641fcfcb076a9e0ee9f013961c894)
下面是range函数有3个参数的情况,在0~9范围内每隔两个数取一次数。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-2.jpg?sign=1738887405-Nuck072UFueI1nxsMEX2MhcfM82yRr6g-0-c45fd446f4e7ca3e4fab201146419ba5)
通过索引获取区间前两个数:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-3.jpg?sign=1738887405-RIEu5WLxmYRIc6C89qf2Dr8Bm81Xfx4B-0-99ba8e3ecc45ec355a2f3b8461ee28f6)
可见,相邻两个数之间的间隔为2。
将区间对象作为list函数的参数可以创建列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-4.jpg?sign=1738887405-DDzjGtH70j04LygaGOXc7nFkpy8BUy2Z-0-a6377886ccfaec50e76e849676aa1a24)
(3)把元组、字典和集合转换为列表
使用list函数也可以把元组、字典和集合等可迭代对象转换为列表。关于元组、字典和集合,将在接下来的各节中陆续介绍,这里先看操作效果。
将元组转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-5.jpg?sign=1738887405-HXFNi342CAEviajbPZb3MYLcAq0u6L4M-0-8e86c3cb7ad5406557c757e8f2229c13)
将字典转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-6.jpg?sign=1738887405-4en6QU69tOpwZopy5dyVqpi85DpPs1Gd-0-3cd5ae35b6d7caddf1c809056f8eb140)
将集合转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-7.jpg?sign=1738887405-mr8l3jHU4iGNnYcgyvCPezEVq75AVMGc-0-d1ea4a35fad55a254994645713438853)
3. 使用split方法创建列表
对于字符串,使用其split方法可以按指定的分隔符进行分割,分割的结果以列表的形式返回。
下面给定一个字符串,使用split方法,用默认的空格分隔符进行分割,返回一个列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-1.jpg?sign=1738887405-I0QdexASJGGLNreT5tKLlXqp2Zos65Aj-0-15add5cc1364fbd854e7d3ea7ed6d507)
4. 深入列表
列表中的每个元素都引用一个对象,每个对象都有自己的内存存储地址、数据类型和值。各元素保存对应对象的地址。
下面创建一个列表,用id函数获取列表中各元素引用的对象的地址。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-2.jpg?sign=1738887405-1OVzUQqMHHXwFa01PdTxZ6HmUr6aXrpe-0-d2e29a578715074c7df3c1194381eff7)
可见,各元素引用的对象的地址各不相同,它们是不同的对象。
1.5.2 添加列表元素
在列表创建以后,可以使用多种方法向列表中添加元素。
1. 使用append方法
使用列表对象的append方法在列表尾部添加新的元素。该方法的执行速度比较快。下面创建一个列表,然后用append方法添加一个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-3.jpg?sign=1738887405-I47psXj2UglMY3MjEhF14S47q1x4oBWV-0-e3d05098eb9d966109d6a808cafe0132)
2. 使用extend方法
与append方法一样,使用extend方法也是在列表尾部添加新的元素。与append方法不同的是,它在列表末尾一次性追加另一个序列的多个值,所以它更适合列表的拼接。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-4.jpg?sign=1738887405-jwLXSkehd4vMbNP1fH24VrcmbHj7UK1L-0-c820ad60c229c9b63676e26d51c56f04)
extend方法的参数还可以是字符串、区间、元组、字典和集合等可迭代对象。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-3.jpg?sign=1738887405-GS3j8AdIFx3VPUqSuvTCKaRxqx8ouJ15-0-b70e2359a9912e554da034df307041d9)
3. 使用insert方法
使用列表对象的insert方法,可以在指定位置插入指定元素。该方法有两个参数,其中第1个参数指定插入的位置,指定一个索引号,即在它对应的对象前面插入新的对象,索引号的基数为0;第2个参数指定插入的对象。
下面创建一个有4个元素的列表,使用列表对象的insert方法在第4个元素前面插入新对象5。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-4.jpg?sign=1738887405-t9BWugFjB88oJG0oK0O1tGdqDTiKyoaW-0-82b6d5e64fdfddc9532707cc4713f504)
4. 使用运算符
使用+(加号)可以将两个列表连接起来,组成一个新的列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-5.jpg?sign=1738887405-eYhMHCHYOqeUQ0MlrAl6W2hNKV5jbBX8-0-ac0085618c0394fd7b4ae74aeeb011ec)
使用乘法扩展,可以将原有列表重复多次,生成新的列表。下面创建一个有2个元素的列表,将它扩展3倍,生成新的列表b。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-6.jpg?sign=1738887405-9WmkRS1HObkeFsvL13HXDi9HidGPB42h-0-3552723d2b28462a67e26158fcc23b66)
1.5.3 索引和切片
在创建列表并向列表中添加元素后,如果希望获取列表中某个或某部分元素并对它们进行后续操作,就要用到索引和切片。索引一般是指访问列表中的某个元素,切片则是指连续访问列表中的部分元素。
使用“[]”进行列表索引操作,方括号中为要索引的元素在列表中的索引号。从左到右索引时,索引号的基数为0;从右到左索引时,索引号的基数为-1。
下面创建一个列表ls。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-1.jpg?sign=1738887405-7bmlksJXZEDdXtI0irITn51CLvRlviFV-0-5336973475f6faacfd2badbcd9138e2e)
通过索引获取列表中的第3个元素:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-2.jpg?sign=1738887405-7QCz3FRGbUqXG0iEihsg0qYlcaFhIpoG-0-aceaf33f7391af36cf7cf167ec5c6f68)
获取列表中倒数第2个元素:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-3.jpg?sign=1738887405-qzCR7HIlRYgjtvl2oKT5p4aiN0GKHP3M-0-b5a853a0a07ef93a6f931eedba8978cd)
使用index方法可以获取指定元素在列表中首次出现的位置。语法格式为:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-4.jpg?sign=1738887405-MPyz8KAaNogp3WzSTkZIImEzMp8hkrx1-0-24bdee686b6fc88934bedac2a1ea9659)
其中,value为指定的元素,start和end指定搜索的范围。
下面创建一个列表a。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-5.jpg?sign=1738887405-teRK4NvPLOcEXRgtfqGYQyeFn7ibSwlB-0-ea400221deaf4e5fa74f670b9f1c41a9)
获取元素2在列表中第一次出现的位置,注意位置索引号的基数为0:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-6.jpg?sign=1738887405-MUDigOAostSG4uwXvhGot5uIxzp8lJXP-0-fe068c73aac796b86856fb02420d9ad1)
从第3个元素开始到最后一个元素,在这个范围内获取元素2第一次出现的位置:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-7.jpg?sign=1738887405-kQwqmEpHYQtcboapgwaAZkvYkdsE1UDr-0-6c2474a9b1f513915d32a89d5dd996fb)
切片操作从给定的列表中连续获取多个元素。常见的列表切片操作如表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=1738887405-BEOiqsZeMePN3Vspfo4gEZwKucKDHhHs-0-5cfbc232552f0493a60b048377f0b964)
1.5.4 删除列表元素
在Python中,可以使用多种方法删除列表元素。
使用列表对象的pop方法可以删除指定位置的元素,如果没有指定位置,则删除列表末尾的元素。
下面创建一个列表,用其pop方法删除最后一个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-2.jpg?sign=1738887405-YW9lbczgL1zDnY10GhWQXdBZrNdIjE38-0-cdfb835e333661c0d90e0ec463c3288e)
继续删除列表中的第3个元素。注意,位置索引号的基数为0。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-3.jpg?sign=1738887405-GYmy7bIeEsdrOmSIC1lOpuVfN8WCqgI3-0-be44ded1d09de5cb101975e0b07af53a)
使用del命令删除指定位置的元素。下面删除列表中的第4个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-4.jpg?sign=1738887405-DUnXooFuZOaXOdxojmrYUTqODPJiEztV-0-068131c210248bda2b5aef8dd114e58c)
pop方法和del命令都是使用索引删除列表元素的,使用remove方法可以直接删除列表中首次出现的指定元素。下面从列表中直接删除第1次出现的元素3。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-5.jpg?sign=1738887405-eQdIlUMUMXwf52lmywfrJ49MR9c4ZTBS-0-cb907c61acf92ced4cc86c80676aa4c0)
如果指定的元素在列表中不存在,则返回出错信息。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-1.jpg?sign=1738887405-UjDJtn2rwvNbimjBzZKgzYZl46GWdsR5-0-222932eba3fab3d17e827a4ed1132a6d)
1.5.5 列表的排序
使用列表对象的sort方法可以对列表中的元素进行排序。默认从小到大排序,不必设置方法参数。下面创建一个列表,使用sort方法将列表元素从小到大进行排序。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-2.jpg?sign=1738887405-d9aYjMeXvszFISorchSXG3R3tGfYXCmQ-0-473f7b64a75c363b516365df9c290ce5)
设置sort方法的reverse参数的值为True,对列表中的元素按照从大到小的顺序进行排列。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-3.jpg?sign=1738887405-pO00H5ZBDSgZuTXLrSzr10ZcUgnogKYA-0-4086b82458e066567d55b276342f1023)
还可以使用Python的内置函数sorted进行排序。该函数不对原列表进行修改,而是返回一个新的列表。设置该函数的reverse参数的值为True,将列表元素进行降序排列。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-4.jpg?sign=1738887405-dVHT4i0ST2qzDJQ9a2LLVkFHBGBdigdd-0-6e7cc0e381a2a2c171b3331764b15d9d)
1.5.6 操作函数
使用len函数获取列表的长度。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-5.jpg?sign=1738887405-pb1Q8Mt4RjqsDaPqaaNkHgDo2XFDW6yT-0-909200b318b0367dffeeccd79076898e)
使用列表对象的count方法指定元素在列表中出现的次数。下面创建一个列表,计算元素2在列表中出现的次数。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-6.jpg?sign=1738887405-htCpzJl1OefR2MpwrXrpWJRdhGiFRFN0-0-402c1653250d8fb076bdda515cc20259)
使用成员运算符in或not in判断列表中是否包含或不包含指定元素,如果是则返回True,否则返回False。下面判断给定列表中是否包含元素1,是否不包含元素4。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-1.jpg?sign=1738887405-DqmrB9D0RFH2Q7PlY0GVYtmTqTdgPDj1-0-ab1603427b25592f48579218ae61ec80)
在使用print函数对列表数据进行格式化输出时,使用索引获取列表的元素。下面创建一个列表,然后使用print函数进行格式化输出。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-2.jpg?sign=1738887405-NsTyUaIFkOOGjNfQU7ExlQGOoaxkqSRW-0-e4e50aca1992e5a81f92f4a1518c00c2)
1.5.7 二维列表
通过列表嵌套可以创建二维或多维列表。二维列表有两层方括号,即列表的元素也是列表。下面创建一个二维列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-3.jpg?sign=1738887405-VdzxwlpZOlEzZwn2HnhDk67ijZH79hTa-0-e07b847102ee861815c25eb4589172df)
对二维列表进行索引和切片时,要指定行维和列维两个方向上的索引号或取值范围。注意,基数为0。
下面获取二维列表中第2行第3列元素的值。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-4.jpg?sign=1738887405-tMBbswiZA2UmjxBxdLUw6rkpUSyvUhUs-0-a8a8ef8456edcfb1038332090e317c9f)
对于二维列表的切片,首先要明白a[1]和a[1:2]之间的区别。a[1]获取的是二维列表a中的第2个元素,是一个一维列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-5.jpg?sign=1738887405-4ZpIzD5KD6f1X4wg3eCcAtVwZzi134YY-0-60fd3be85bcb57b0261ede7f5fb71b0b)
a[1:2]获取的则是一个二维列表,即:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-6.jpg?sign=1738887405-MliVW0FSenFXp6EVDn6FWsbB2vd9Dx0C-0-b1448f432fe8cbf580635754fab63057)
然后就比较好理解下面的结果了:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-7.jpg?sign=1738887405-Y2QGbPHPVugnqktYro0S8RsjoHOBy1K1-0-65f100baef2040d50c1effb5bf3eb586)
以及
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/046-1.jpg?sign=1738887405-SWQTSjilY3Grw6DCKSt2avjVXjblsKzs-0-4ba2ac39fefdcf6c512114a42a13ce42)
请反复比较和理解它们之间的差别。