![Python基础及应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/836/41309836/b_41309836.jpg)
4.3 List(列表)
List又叫列表,也是一个线性结构,它的表达形式是:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/76_02.jpg?sign=1739197910-NQQtsz6IjvdYzEboxBHFkkuMapYqqFV4-0-05834e8f0fd70e1871c45ece8aa68c61)
List的性质和Tuple是非常类似的,上述Tuple的操作都可以用在List上,但是List有一个最重要的特点就是元素可以修改,所以List的功能要比Tuple更加丰富。
由于List的查找和遍历语法与Tuple是完全一致的,所以这里就不再赘述了,我们把主要精力放到List的特性上。
4.3.1 添加
之前已经提到了,List是可以修改的,因此可以在尾部添加一个元素,比如:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/76_03.jpg?sign=1739197910-3ARZXbvuTBTJQYThBL4jwPqCllX2W9mz-0-e7d1e8248018bcc076f0da76a02f84a5)
这段代码会输出:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/76_04.jpg?sign=1739197910-OrnPmUcpyCC6ex3AHz4A3JmVUGFQ8qYA-0-d5ccb3ee10ab00a012f8be624c36182b)
append方法的作用是在List后面追加一个元素,类似地,还有extend和insert可以用于添加元素,比如:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/76_05.jpg?sign=1739197910-u8E7j3iVBJGNvsTv36r5f3WgPcThdP5h-0-66ea129096e51b0f890dd5dbed40bbb2)
这段代码会输出:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/76_06.jpg?sign=1739197910-9wqGU4kHiuFMBeSxSv825e4QkqMgwTtd-0-dde8f03992160ae9fef5fe7fbc00ed71)
extend接收一个参数,内容为要合并进这个list的一个可迭代对象,所以这里可以传入一个List或者Tuple。
insert接收两个参数,分别是下标和被插入的对象,可以在指定下标位置插入指定对象。
4.3.2 删除
由于List元素是可以修改的,因此删除也是允许的,List删除元素有三种方法。
1.del操作符
del是一个Python内建的一元操作符,只有一个参数是被删除的对象,比如:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/77_01.jpg?sign=1739197910-pBwrCudNB3y6Z2CvGWy2Tcrg5QQjZyMT-0-5eefb2dfe12c2c95a7a7c56bbf836836)
这段代码会输出:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/77_02.jpg?sign=1739197910-MVKspJFyLqFdqJERdCYcRaWijUZUjID0-0-ab1e83784f3e6ce3f9e67dd326e72779)
del一般用来删除指定位置的元素。
2.pop方法
pop方法没有参数,默认删除最后一个元素,比如:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/77_03.jpg?sign=1739197910-K8EfJ1cf6Yk7iKo4N97aa64QzkgPICPu-0-95902ee255c8f6dca98c557f9e6f5133)
这段代码会输出:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/77_04.jpg?sign=1739197910-ktbin12ZDlRaZbsVPPCwDX9IfqhWTRyF-0-edd8a17934da94e83fb5605e90a3c09f)
3.remove方法
remove方法接收一个参数,为被删除的对象,比如:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/77_05.jpg?sign=1739197910-N4yJAJ2mVfLn1cVjXh7thi2uVkSXSLgi-0-496a4f216d35409fcfa17ac9c1a56b9e)
这段代码会输出:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/77_06.jpg?sign=1739197910-8rBK34Qdn9vl5IFP1H80rYgwuS95gE5M-0-46730c5643dc575ef3f865e01b7bd9b0)
同时也可以看出remove是从前往后查找,删除遇到第一个相等的元素。
4.3.3 修改
List可以在原位进行修改,直接用下标访问就可以,比如:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/78_01.jpg?sign=1739197910-4bi22fNoIGRwnTgoQAi0l2UcQ4xQw7Lh-0-aaf8b443627e05266649bb6ac4ca375e)
这段代码会输出:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/78_02.jpg?sign=1739197910-Z2nvB0v34S7AnzMUxhnj25Q9cEKPJEpz-0-49dc13432c5bffe4a201c3afa4e271a8)
这样第三个元素就被修改了。
还记得我们刚刚学习的切片操作符吗?对于List来说可以一次修改一段值,比如:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/78_03.jpg?sign=1739197910-ktRhzudgwHrKQ2eukox4f5mxS29V00Eg-0-ec7bf06f2596a25f7b6a5695099e2fb5)
这段代码会输出:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/78_04.jpg?sign=1739197910-Jit4WulH8ksyWqbwBmKMevj3hi8udnim-0-c3364cc660932f532ecfd06916906fd5)
也可以等间隔赋值:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/78_05.jpg?sign=1739197910-kM7KjYZfedrmLWzKRsiYECJSSRyqAZpw-0-8c19c60d8673d7b649faa9642c938e65)
这段代码会输出:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/78_06.jpg?sign=1739197910-YXTyyO3UDEr3UVPC9lEsrPZgtsoCfM1H-0-abed19295f70cc939be6c575d7e849af)
很多时候我们希望在遍历过程中修改值,那么就有了新的问题,如果删除了一个值,那么之后会不会遍历到已删除的值?而如果在尾部添加了一个值,那么之后新添加的值会不会被遍历到?在Python中遍历List时修改值是完全安全的,不会遍历到删除的值并且新添加的值会正常遍历,我们看一个例子:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/78_07.jpg?sign=1739197910-Cu3EqL2yxxa1rnfZJ6N1UpDelMHCh6wT-0-d34eaa472c2b293d8907cfab3417aaa0)
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/79_01.jpg?sign=1739197910-bh60iLSA4j1vKBgl2Ij3SqgBoFcxqsSF-0-3e6c865d41bcb13971c3664ff6b65d33)
在for循环中建立的循环变量item只是原对象list1中元素的一个拷贝,所以直接修改item不会对list1造成任何影响,我们依旧需要用下标或者List的方法来修改list1的值。
之前我们都是通过while来完成跟下标有关的循环的,这里介绍如何用for来进行下标相关的循环,那就是利用enumerate返回一个迭代器,这个迭代器可以同时生成下标和对应的值用于遍历。当然由于还没有讲到函数和面向对象的相关知识,这里只要有个印象即可,能模仿使用更好。
4.3.4 排序和翻转
很多时候,我们希望数据是有序的,而List提供了sort方法用于排序和reverse方法用于翻转,比如:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/79_02.jpg?sign=1739197910-e3fs88p5MNxp4XMdGpB7r2NZ73t0cPBO-0-8f7b75e1a8925d593cd1fa89c458520f)
这段代码会输出:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/79_03.jpg?sign=1739197910-H3pDWRh7PjXi2X2yTq1AidYZBFKLRfQk-0-b7ecb589a124ecb1f227cbaa4b1774b2)
第一个reverse方法的作用就是将List前后翻转,第二个sort方法是将元素从小到大排列,第三个sort加了一个reversed=True的参数,所以它会从大到小排列元素。
4.3.5 推导式
列表推导式是一种可以快速生成List的方法。
比如想生成一个含有0~100中所有偶数的列表可能会这么写:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/79_04.jpg?sign=1739197910-SYcL1xq4tZtYlQMOwujxdHbkxVvhAhT2-0-48b9b77689b3b750fabfddb84237216c)
但是如果使用列表推导式,只用一行即可:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/79_05.jpg?sign=1739197910-rYtGadQdvW7R00fAmdu8jwZzr3LI8i4F-0-9350cf4dfcd8f15944f1396b9c9b3427)
怎么理解这个语法呢?这里的语法很像经典集合论中对集合的定义,其中最开始的i是代表元素,而后面的for i in range(101)说明了这个元素的取值范围,最后的一个if是限制条件。
同时代表元素还可以做一些简单的运算,比如:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/80_01.jpg?sign=1739197910-CxMVHeNOm8XHwE0ObE4rBu2Hc5nfCBL6-0-03b5435158668da497024e21fbb4cb63)
这里输出的结果是:
![](https://epubservercos.yuewen.com/82BE21/21511156608178806/epubprivate/OEBPS/Images/80_02.jpg?sign=1739197910-jlpfZGPfMs8WN7Muibn3LAJMgrifYEgp-0-3e974870b6ae5cef51f2cdda974af023)
这里依靠列表推导式就快速生成了100以内的完全平方数。
另外值得一提的是,列表推导式不仅简洁、可读性高,更关键的是相比之前的循环生成,列表推导式的效率要高得多,因此在写Python代码中应该善于使用列表推导式。