![代替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=1739420250-XcUWMtLbNQJTGEXVAtnVYiUvNh4038lr-0-919346bd970c0114b6fdb5594ad7cbfa)
创建一个元素为一组数据的列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/037-4.jpg?sign=1739420250-ewMSWZubz1wrBwa5Hu19a3XXMb3QwXP4-0-e1198cd694fe3a73f0d6aef8371661fa)
创建一个元素为一组字符串的列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/037-5.jpg?sign=1739420250-1DDLIjzx6MVq1ZISMyLKbKrt0HdoFlNq-0-8f60f3036b123c67b24a01b7a01e5757)
列表元素的数据类型可以不同。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-2.jpg?sign=1739420250-BlIjaNltZeybYISlnrOssSwB7UJtjibI-0-e19725d0092050bee860bd79542963e6)
列表的元素也可以是列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-3.jpg?sign=1739420250-LEdmK2Mh5xfQG1wmSt4FgOt0wsWppRsH-0-b758ef6ce16ce1881c2267035d608037)
2. 使用list函数创建列表
使用list函数能将任何可迭代的数据转换成列表。可迭代的数据包括字符串、区间、元组、字典、集合等。
当list函数不带参数时将创建一个空的列表,例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-4.jpg?sign=1739420250-8dGxwOA3BuKrnSpiFRSlrE73TGS7nAc1-0-86f6bb3dd46a3c18b5ade610f6a721a4)
(1)把字符串转换为列表
当list函数的参数为字符串时,将该字符串转换为元素由字符串中各字符组成的列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-5.jpg?sign=1739420250-0RTMPAMiNl4FW09XOIHC4Qg7oqVc9cVk-0-e185f179c382c638b3a85bbf705cdd95)
(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=1739420250-NFRmwQY1XfXBrw3T6I4glfSsKsK6UKFb-0-12e2a519775b10c12aeb78efdff71503)
生成的区间对象从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=1739420250-iY5KhjRaT6jawMxYhwp6YHD0l5cuu6av-0-9a82c5fc7eaf400efeb78841077f2f8e)
下面是range函数有3个参数的情况,在0~9范围内每隔两个数取一次数。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-2.jpg?sign=1739420250-dS6cNeWLKKARy6h3JWpRzN5ko80fl35y-0-302e069508487c58378105b6dbc6cc61)
通过索引获取区间前两个数:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-3.jpg?sign=1739420250-OOU4FCh5NB6UtHx9Wk59HzdA2bPHGZ2Z-0-55215e3afd91ca24b897c4fa6f1bccaa)
可见,相邻两个数之间的间隔为2。
将区间对象作为list函数的参数可以创建列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-4.jpg?sign=1739420250-vZLZksq69NW5BnUGQJZPXh422QVTeyXl-0-faf27ff0181ffa2fa280de13c438700c)
(3)把元组、字典和集合转换为列表
使用list函数也可以把元组、字典和集合等可迭代对象转换为列表。关于元组、字典和集合,将在接下来的各节中陆续介绍,这里先看操作效果。
将元组转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-5.jpg?sign=1739420250-rKgqBiNrhw6nIsXKOUq22JWttkAbcT8m-0-8ce68306ce5b812fd73d988c1496eee0)
将字典转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-6.jpg?sign=1739420250-VJ3ZP6RYdJgxP9rRf8LjAebucWSECLJ2-0-fce2b74f6108c040b26dde3bc12b0435)
将集合转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-7.jpg?sign=1739420250-o4AGDb2ODKzIV4nwvElOjY1xI0JiFfK5-0-8c22ed0d576b9254aaf20d03a597e60d)
3. 使用split方法创建列表
对于字符串,使用其split方法可以按指定的分隔符进行分割,分割的结果以列表的形式返回。
下面给定一个字符串,使用split方法,用默认的空格分隔符进行分割,返回一个列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-1.jpg?sign=1739420250-jqYpdBz4Mjcadj8lssZKWoIAH11TcvgC-0-bea4a4ff6784c663ee3178bb79077de8)
4. 深入列表
列表中的每个元素都引用一个对象,每个对象都有自己的内存存储地址、数据类型和值。各元素保存对应对象的地址。
下面创建一个列表,用id函数获取列表中各元素引用的对象的地址。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-2.jpg?sign=1739420250-KV0bfc1JnqWTF7DisaANT8AfheIJvqdN-0-f4a2a6248d8057c4ed115ade015d100e)
可见,各元素引用的对象的地址各不相同,它们是不同的对象。
1.5.2 添加列表元素
在列表创建以后,可以使用多种方法向列表中添加元素。
1. 使用append方法
使用列表对象的append方法在列表尾部添加新的元素。该方法的执行速度比较快。下面创建一个列表,然后用append方法添加一个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-3.jpg?sign=1739420250-dqsrD0HXxRuntD9ff6ooessCt9WiUvbO-0-411fe44757fcf07551b7f0eb7f594fe6)
2. 使用extend方法
与append方法一样,使用extend方法也是在列表尾部添加新的元素。与append方法不同的是,它在列表末尾一次性追加另一个序列的多个值,所以它更适合列表的拼接。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-4.jpg?sign=1739420250-pfeiXlLQBHWKo5hK8oLszy9E0xUhLp3E-0-67bd7c8ff0d8ff33cf48a1904d0ba69e)
extend方法的参数还可以是字符串、区间、元组、字典和集合等可迭代对象。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-3.jpg?sign=1739420250-bBYn9hy18YmJibjoejC4VYA5ux6Gs0Gz-0-e643e76db0096b5bee55f6afb1168b60)
3. 使用insert方法
使用列表对象的insert方法,可以在指定位置插入指定元素。该方法有两个参数,其中第1个参数指定插入的位置,指定一个索引号,即在它对应的对象前面插入新的对象,索引号的基数为0;第2个参数指定插入的对象。
下面创建一个有4个元素的列表,使用列表对象的insert方法在第4个元素前面插入新对象5。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-4.jpg?sign=1739420250-sjQKkqX7qd8DHWJpGgLw5HaX115Bcr5W-0-e8513972f37623fb0ced997fb5df35ba)
4. 使用运算符
使用+(加号)可以将两个列表连接起来,组成一个新的列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-5.jpg?sign=1739420250-rsrw33c8NPYQYRczLG2FnT6ZAlmTOyGj-0-aaf96de9d00ce64c7101b8f76dad838e)
使用乘法扩展,可以将原有列表重复多次,生成新的列表。下面创建一个有2个元素的列表,将它扩展3倍,生成新的列表b。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-6.jpg?sign=1739420250-3tuiWWffeGrXERd8ByAyA6II8wP6Dyyl-0-8ceddf22773cd0b1a5ad9c5daaae3d64)
1.5.3 索引和切片
在创建列表并向列表中添加元素后,如果希望获取列表中某个或某部分元素并对它们进行后续操作,就要用到索引和切片。索引一般是指访问列表中的某个元素,切片则是指连续访问列表中的部分元素。
使用“[]”进行列表索引操作,方括号中为要索引的元素在列表中的索引号。从左到右索引时,索引号的基数为0;从右到左索引时,索引号的基数为-1。
下面创建一个列表ls。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-1.jpg?sign=1739420250-NZgM9HAR4wBPCsT6RlDZCLfu6CHLtosv-0-f2c91fe0129d3bd0cc6fb523b18b9dda)
通过索引获取列表中的第3个元素:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-2.jpg?sign=1739420250-CNDsCX9Gth4WNAAifPGiFdlF7hzxEKW8-0-6761cb285fa35310e5c0056f00bc96ac)
获取列表中倒数第2个元素:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-3.jpg?sign=1739420250-dgpMhq6nO5LMspUcAIkrgvmvyccrIkPz-0-44a03e890849434f3864813773759630)
使用index方法可以获取指定元素在列表中首次出现的位置。语法格式为:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-4.jpg?sign=1739420250-aiUHnBVyBXgLmaFRlWINgkgGOs8LIiSF-0-42c13523db6343496972ccfd8c5457da)
其中,value为指定的元素,start和end指定搜索的范围。
下面创建一个列表a。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-5.jpg?sign=1739420250-I7yKzu89z86TrKtVcBjwm9JPtNKw5J5K-0-f528ce1c902d29e2b10dfe83c02929cc)
获取元素2在列表中第一次出现的位置,注意位置索引号的基数为0:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-6.jpg?sign=1739420250-68nNxw30XLxzNwhxFKDORzLnx3tpbyfY-0-a3e6f4e53a12d3e4e0a57bb72da26ff4)
从第3个元素开始到最后一个元素,在这个范围内获取元素2第一次出现的位置:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-7.jpg?sign=1739420250-Ix9qbt9e0HTWzWARCtbQXOfu9FBmK8NG-0-7b007bc898bec5e5cf70dcf5833c0ad8)
切片操作从给定的列表中连续获取多个元素。常见的列表切片操作如表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=1739420250-XZBL5hDzzhNNWErYs6tYHVCXKnwisddu-0-7b09ddf164f30180b8110bca304d84b7)
1.5.4 删除列表元素
在Python中,可以使用多种方法删除列表元素。
使用列表对象的pop方法可以删除指定位置的元素,如果没有指定位置,则删除列表末尾的元素。
下面创建一个列表,用其pop方法删除最后一个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-2.jpg?sign=1739420250-3ePKioBDeGkz2x0RkJRBXef0OlzFiANQ-0-f0183be1530ef69b53130cf1fe9c4adb)
继续删除列表中的第3个元素。注意,位置索引号的基数为0。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-3.jpg?sign=1739420250-5tgeRhe4qQN2gbY87I1R71YKw8oh5l0A-0-858834408a160a80c968f50ee29dd281)
使用del命令删除指定位置的元素。下面删除列表中的第4个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-4.jpg?sign=1739420250-UpOTPHv818s1lVPwuF69H3F5AMKoO3z9-0-925b271544e1d89c34cdc837d88e139d)
pop方法和del命令都是使用索引删除列表元素的,使用remove方法可以直接删除列表中首次出现的指定元素。下面从列表中直接删除第1次出现的元素3。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-5.jpg?sign=1739420250-FoQ2KPsuBqEVugo8YeRyo5fScr1VKJz4-0-338d008db5682fc7fd33968dae8ae6f8)
如果指定的元素在列表中不存在,则返回出错信息。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-1.jpg?sign=1739420250-MLrKviTfk8eHkn7ZIu12whWLVYiusPTq-0-e40993abd83a2ec2d3810ee42a0b46e6)
1.5.5 列表的排序
使用列表对象的sort方法可以对列表中的元素进行排序。默认从小到大排序,不必设置方法参数。下面创建一个列表,使用sort方法将列表元素从小到大进行排序。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-2.jpg?sign=1739420250-pmcyAwW3O5IQtAUgGouYZjBadhxaRApj-0-4e73412931accff4e734fcb3f5ce4486)
设置sort方法的reverse参数的值为True,对列表中的元素按照从大到小的顺序进行排列。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-3.jpg?sign=1739420250-hCu8E0EeQcwlpVZSsgXPQh4OfOInWHES-0-e1468183ff0083a529e3ec127724277d)
还可以使用Python的内置函数sorted进行排序。该函数不对原列表进行修改,而是返回一个新的列表。设置该函数的reverse参数的值为True,将列表元素进行降序排列。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-4.jpg?sign=1739420250-VkGffbLTE8IxpYxsrJRUbmeMGL1IX6kz-0-c4ac06e05c62a50a650b3e97a38780bd)
1.5.6 操作函数
使用len函数获取列表的长度。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-5.jpg?sign=1739420250-ThfUVXCXm8jlNy6qXIzSafSgAEnDHrx4-0-1fbd470c6bd3618b39478f9edeb231f0)
使用列表对象的count方法指定元素在列表中出现的次数。下面创建一个列表,计算元素2在列表中出现的次数。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-6.jpg?sign=1739420250-yP9LNwOsdWh1bv3fcRLkaN728NPL3aBc-0-ee928bb887cf79c36c477e18f5d5f5fd)
使用成员运算符in或not in判断列表中是否包含或不包含指定元素,如果是则返回True,否则返回False。下面判断给定列表中是否包含元素1,是否不包含元素4。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-1.jpg?sign=1739420250-10p2A9m3jpGoYypGMqONihcHbQAinGCb-0-0929f065627c22ea3e486f820265e4f5)
在使用print函数对列表数据进行格式化输出时,使用索引获取列表的元素。下面创建一个列表,然后使用print函数进行格式化输出。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-2.jpg?sign=1739420250-yZuNbvDdx9sD3qre6KIlRQqt92KtvlfC-0-a49f596329be61438869181cf41d4aaa)
1.5.7 二维列表
通过列表嵌套可以创建二维或多维列表。二维列表有两层方括号,即列表的元素也是列表。下面创建一个二维列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-3.jpg?sign=1739420250-Cd06LSp1zxHKfiyUCpmHUSPWmUFeacgQ-0-3dca25a83f25312ec4f5dea4b3e86461)
对二维列表进行索引和切片时,要指定行维和列维两个方向上的索引号或取值范围。注意,基数为0。
下面获取二维列表中第2行第3列元素的值。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-4.jpg?sign=1739420250-IPq0nxXAd51DWHqKduBguQGoWosrPIZv-0-8091a32253126b22dc7e9e234885fad9)
对于二维列表的切片,首先要明白a[1]和a[1:2]之间的区别。a[1]获取的是二维列表a中的第2个元素,是一个一维列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-5.jpg?sign=1739420250-KByFgrxEYtRHlaEEyQIAimq6b6CyPv9Y-0-b5d0c6d617238cbc3bf4f04d4785fdd6)
a[1:2]获取的则是一个二维列表,即:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-6.jpg?sign=1739420250-IQmafSgWceAOQhdn3NV33IPr7x2PbNSe-0-28bdfbd94afcd2bb37d3a3ba5150a9a1)
然后就比较好理解下面的结果了:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-7.jpg?sign=1739420250-LVueVb9SHWHKwmJuuEONhfR5QNJWQ00V-0-a6df785f0ed76f806cb7c2a6754fb360)
以及
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/046-1.jpg?sign=1739420250-S2G3Qyz1BjoeryC8RQQT0c2ENkJyscny-0-27777a9e4907b7cda69b9b4d11500d0c)
请反复比较和理解它们之间的差别。