![代替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=1739276197-QxEqgBwpuDvRZwFxFLepeBYslChkQuuz-0-cd888d4593f4d9655e2e07dd9d30195d)
创建一个元素为一组数据的列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/037-4.jpg?sign=1739276197-KZrC3VMwgyJDShHissPRg19t0H4ESSJG-0-530f5eab35d50ad6ba90789b0d69b247)
创建一个元素为一组字符串的列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/037-5.jpg?sign=1739276197-lVrSCW4OjhgNQVR7xnYjNS38ewDfZ1CN-0-0d8d9eb3570eb8de2c07408f6b6f16f5)
列表元素的数据类型可以不同。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-2.jpg?sign=1739276197-roDm5gBJMbgdvQoGEuClM56Wo3inbdPk-0-88071383006999d9f567cff37ac977db)
列表的元素也可以是列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-3.jpg?sign=1739276197-6yCZNe58V7rmg4o8OFhllc35psLuTGQC-0-c59bb3ba8c966c9287178a3e21559115)
2. 使用list函数创建列表
使用list函数能将任何可迭代的数据转换成列表。可迭代的数据包括字符串、区间、元组、字典、集合等。
当list函数不带参数时将创建一个空的列表,例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-4.jpg?sign=1739276197-33TPmRKcT4SI6YuYScLeS4jySWj6aZwJ-0-03f03761194470e049c8b0aaec7600b0)
(1)把字符串转换为列表
当list函数的参数为字符串时,将该字符串转换为元素由字符串中各字符组成的列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/038-5.jpg?sign=1739276197-YKwjHxa8FQyXInjQCm369Rvu5jFXUwyQ-0-f877212e9f91ba94f68cfab2f7f71faa)
(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=1739276197-7bNw8YFXR7M50AVdHWkTYVoMp4GqZvjS-0-a93a453253ab6ccd2bdc868e52371c5f)
生成的区间对象从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=1739276197-OagrY9cEEGBhJdMUinld2Np5YDgR1nYz-0-e290af6c6774c7246c7470a02317c53e)
下面是range函数有3个参数的情况,在0~9范围内每隔两个数取一次数。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-2.jpg?sign=1739276197-li8uHMCqWeKCIcGR7vFc1KgWSym4wodm-0-a9fadee0055ddffab8997a384b52b034)
通过索引获取区间前两个数:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-3.jpg?sign=1739276197-j8bLHs1EbIcFCbPvjlYQ1YnzsTLxHqo3-0-dad73f712eed0f061e3014122af92b53)
可见,相邻两个数之间的间隔为2。
将区间对象作为list函数的参数可以创建列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-4.jpg?sign=1739276197-OO7JvG59leceer0NFO2BiLeAkvzO3uls-0-a68ee8b0b8849e4f979a280d8f053851)
(3)把元组、字典和集合转换为列表
使用list函数也可以把元组、字典和集合等可迭代对象转换为列表。关于元组、字典和集合,将在接下来的各节中陆续介绍,这里先看操作效果。
将元组转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-5.jpg?sign=1739276197-7BDujpjrAKtMHvUcYArrdWAOPTnaJrE0-0-ccdf00ee83ef4e0f9cf02afce61c8868)
将字典转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-6.jpg?sign=1739276197-xIyDB0Plg4G7sWOskhTu4dP9u5BNPPEE-0-5dad0298ba882818629fdb55430a7930)
将集合转换为列表:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/039-7.jpg?sign=1739276197-M1VnEmxbjPbi3OpEsZjA1z5VpAdRQjDX-0-c95d8476910e1c9ba6c198a3779beb4f)
3. 使用split方法创建列表
对于字符串,使用其split方法可以按指定的分隔符进行分割,分割的结果以列表的形式返回。
下面给定一个字符串,使用split方法,用默认的空格分隔符进行分割,返回一个列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-1.jpg?sign=1739276197-YtNNNfRHi89x5vif5FjpdPlZIpjpu8Nb-0-39e3bd4147c69e58cfaa0ddb5acaec25)
4. 深入列表
列表中的每个元素都引用一个对象,每个对象都有自己的内存存储地址、数据类型和值。各元素保存对应对象的地址。
下面创建一个列表,用id函数获取列表中各元素引用的对象的地址。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-2.jpg?sign=1739276197-znscyHfiJpm1FCaIpLehCKTgDvPiRvCi-0-b0df03f21ce6b0a065eb1cbd19b6e2a8)
可见,各元素引用的对象的地址各不相同,它们是不同的对象。
1.5.2 添加列表元素
在列表创建以后,可以使用多种方法向列表中添加元素。
1. 使用append方法
使用列表对象的append方法在列表尾部添加新的元素。该方法的执行速度比较快。下面创建一个列表,然后用append方法添加一个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-3.jpg?sign=1739276197-coRfDlFG7vozGf6AQfv6COpYnw5pJ713-0-2b03469cd92c41eac0c90748365d45a5)
2. 使用extend方法
与append方法一样,使用extend方法也是在列表尾部添加新的元素。与append方法不同的是,它在列表末尾一次性追加另一个序列的多个值,所以它更适合列表的拼接。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/040-4.jpg?sign=1739276197-WfcWp5VwZIdOp2FGckfrOJ2LS5MTL2Ou-0-921e05b8baa564ff7b844598a4dc48bb)
extend方法的参数还可以是字符串、区间、元组、字典和集合等可迭代对象。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-3.jpg?sign=1739276197-91nNsn7wnq1mSWJDS1EeNLxVXAJ4jJGL-0-9faea2ab61ac420a4a16b613c7849a7f)
3. 使用insert方法
使用列表对象的insert方法,可以在指定位置插入指定元素。该方法有两个参数,其中第1个参数指定插入的位置,指定一个索引号,即在它对应的对象前面插入新的对象,索引号的基数为0;第2个参数指定插入的对象。
下面创建一个有4个元素的列表,使用列表对象的insert方法在第4个元素前面插入新对象5。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-4.jpg?sign=1739276197-faoxPrSBAe0gMztSH8RLN7QX5jw9wub1-0-737de02912b3defb7b3fbe700522f6df)
4. 使用运算符
使用+(加号)可以将两个列表连接起来,组成一个新的列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-5.jpg?sign=1739276197-TavOukMx178n7y88COq0EPV7zXs4pJRJ-0-80e75655ad2a804ff81cbc19ef53ba77)
使用乘法扩展,可以将原有列表重复多次,生成新的列表。下面创建一个有2个元素的列表,将它扩展3倍,生成新的列表b。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/041-6.jpg?sign=1739276197-h7luCqFO83QvVnj1vgnTEuD7HYOIBTz0-0-8c888cf9e078b3166beb726a18c78b6c)
1.5.3 索引和切片
在创建列表并向列表中添加元素后,如果希望获取列表中某个或某部分元素并对它们进行后续操作,就要用到索引和切片。索引一般是指访问列表中的某个元素,切片则是指连续访问列表中的部分元素。
使用“[]”进行列表索引操作,方括号中为要索引的元素在列表中的索引号。从左到右索引时,索引号的基数为0;从右到左索引时,索引号的基数为-1。
下面创建一个列表ls。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-1.jpg?sign=1739276197-uvBVLY0gBOzNcSWcAd0cRfhzVcUUjlwD-0-3fc77ade08868f23c0dcffba21272ea1)
通过索引获取列表中的第3个元素:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-2.jpg?sign=1739276197-CQJKeFn8wBe4Fpo7pF57FXJnwRThSFzm-0-22dd73d401d3d5fc267fc1710292f3b8)
获取列表中倒数第2个元素:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-3.jpg?sign=1739276197-XHXrwJ3ngo21zBAprnidAHfFcs5WsxW8-0-8f667dc17b591fcc6de95e267776e8bc)
使用index方法可以获取指定元素在列表中首次出现的位置。语法格式为:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-4.jpg?sign=1739276197-EEQ7AH4zGuLuU4RkJR2pJvgx6xeQRwJh-0-525ddea4eea572a311cef0a150a65af1)
其中,value为指定的元素,start和end指定搜索的范围。
下面创建一个列表a。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-5.jpg?sign=1739276197-iemZryQk6RannjWQNbMj7ZayKGwcH5Kp-0-0d659f9ae0a47ea2ddf99b541d6305a5)
获取元素2在列表中第一次出现的位置,注意位置索引号的基数为0:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-6.jpg?sign=1739276197-rDb4wPOxPehoIgEStKCzDt7uVTfUDPj8-0-40a5836492206518e17ece1c19a982b4)
从第3个元素开始到最后一个元素,在这个范围内获取元素2第一次出现的位置:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/042-7.jpg?sign=1739276197-6Gy5WLlEenHoKviwKsgHPOYH6XtIrWwf-0-978a1e3334b6164ee55d0ac6d4a95f13)
切片操作从给定的列表中连续获取多个元素。常见的列表切片操作如表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=1739276197-G3mdEolxIhhoi6ATfDwqvProFQCi8hDj-0-cc95286ea9f3ed56e030066fbfc4b0d9)
1.5.4 删除列表元素
在Python中,可以使用多种方法删除列表元素。
使用列表对象的pop方法可以删除指定位置的元素,如果没有指定位置,则删除列表末尾的元素。
下面创建一个列表,用其pop方法删除最后一个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-2.jpg?sign=1739276197-VEAQ6YGw6ZZJXBO9qgfZAkIdJ7WDdqLq-0-23aef6ad38a4baa80d8a62632358e193)
继续删除列表中的第3个元素。注意,位置索引号的基数为0。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-3.jpg?sign=1739276197-DcS9nPi0VF5NSDSFUn98i7VKysgPv2xn-0-1ed41c0d722bf611b53729c943822ff6)
使用del命令删除指定位置的元素。下面删除列表中的第4个元素。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-4.jpg?sign=1739276197-fgZf76HPJ7lcqOskQ5a8j2d7Z1e6EW4s-0-961462cbb090e9485ff846630a5de8bf)
pop方法和del命令都是使用索引删除列表元素的,使用remove方法可以直接删除列表中首次出现的指定元素。下面从列表中直接删除第1次出现的元素3。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/043-5.jpg?sign=1739276197-ufmrkZsRzqr3LG2WCcGbs0lJ9qBM17nK-0-60fd2fc76b42056bc91c4aeb7b909532)
如果指定的元素在列表中不存在,则返回出错信息。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-1.jpg?sign=1739276197-oCNqT0wPyiJJoU6AEwHQQi7J6Bl1qHAK-0-d67ae2f9fdefda528affb98284c38e0c)
1.5.5 列表的排序
使用列表对象的sort方法可以对列表中的元素进行排序。默认从小到大排序,不必设置方法参数。下面创建一个列表,使用sort方法将列表元素从小到大进行排序。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-2.jpg?sign=1739276197-oqciG2Hs0W69Dwdp0CUHR5VSbWtSFA9J-0-2084615e87370554ea6e1279d80dfb36)
设置sort方法的reverse参数的值为True,对列表中的元素按照从大到小的顺序进行排列。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-3.jpg?sign=1739276197-2zG7WUeT2se9WKyVHCw7B92CKKLnJjLM-0-a191f2ecedd3a8383aa03bba6ed3c177)
还可以使用Python的内置函数sorted进行排序。该函数不对原列表进行修改,而是返回一个新的列表。设置该函数的reverse参数的值为True,将列表元素进行降序排列。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-4.jpg?sign=1739276197-L8nRJv4UeA8wHAmsjdhkvGKRx0EzRfSo-0-9b661c241119d2e6b5da5380f090d7df)
1.5.6 操作函数
使用len函数获取列表的长度。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-5.jpg?sign=1739276197-XBfSNKeFo45JQU3aOsNulkYgvt3yrOrx-0-f88221b7153d52c415af7b2d74aeba98)
使用列表对象的count方法指定元素在列表中出现的次数。下面创建一个列表,计算元素2在列表中出现的次数。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/044-6.jpg?sign=1739276197-33gsU7GuIbN5dtGtY8vfVEhgIhYQBuxv-0-98b5fa77032aa439f8dbdcb444b55537)
使用成员运算符in或not in判断列表中是否包含或不包含指定元素,如果是则返回True,否则返回False。下面判断给定列表中是否包含元素1,是否不包含元素4。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-1.jpg?sign=1739276197-c7PN1RfpSuyS4L4RtY1RD3AFZr0Ksmzx-0-db0de674b1d14c21693c3358312c48dd)
在使用print函数对列表数据进行格式化输出时,使用索引获取列表的元素。下面创建一个列表,然后使用print函数进行格式化输出。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-2.jpg?sign=1739276197-3I1myt4SZT7PThYprLuJm6JTj4XM7Qtj-0-a18fe2ff18c40738bfced7d2c08d3352)
1.5.7 二维列表
通过列表嵌套可以创建二维或多维列表。二维列表有两层方括号,即列表的元素也是列表。下面创建一个二维列表。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-3.jpg?sign=1739276197-0Km5ieJslkfikwX8CTRt2D85b3NYwpmn-0-29ad476e2f80586155aaac36dcf8c07b)
对二维列表进行索引和切片时,要指定行维和列维两个方向上的索引号或取值范围。注意,基数为0。
下面获取二维列表中第2行第3列元素的值。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-4.jpg?sign=1739276197-ETZHJVv7r4GeSKteL48HS55LHbvg3dc9-0-235065b2e236c326e395348b7419d5c6)
对于二维列表的切片,首先要明白a[1]和a[1:2]之间的区别。a[1]获取的是二维列表a中的第2个元素,是一个一维列表。例如:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-5.jpg?sign=1739276197-n6EtNfZzVy9AJ1zAHizH5Xw5n3jwaWxR-0-80e9dc9696eb2aa03c59cfc89f022d06)
a[1:2]获取的则是一个二维列表,即:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-6.jpg?sign=1739276197-S3K0L1TIeHDYedm4GYGKZuuukKvpx27q-0-14163c2623d7fe3fa6b3579a6ff8baa9)
然后就比较好理解下面的结果了:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/045-7.jpg?sign=1739276197-rCQAs4Z6mYDJq4EO4HaSaIV0MFU3vgrq-0-74c81bc124a34885e758b16485aa0eca)
以及
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/046-1.jpg?sign=1739276197-YR725kCbaBHSudlxrz0l5UlBpZpB9gPi-0-b7c55ad029ea1f8fe5e597e44539d0bd)
请反复比较和理解它们之间的差别。