![Python程序设计教程(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/531/34752531/b_34752531.jpg)
4.5.1 列表推导式
列表推导式(list comprehension)是Python开发时用得最多的技术之一,表示对可迭代(Iterable)对象的元素进行遍历、过滤或再次计算,生成满足条件的新列表。它的结构是在一个中括号里包含一个函数或表达式(再次计算),接着是一个for语句(遍历),然后是0个或多个for(遍历)或者if语句(过滤),在逻辑上等价于循环语句,但是形式上更简洁。
语法形式:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image103.jpg?sign=1738957414-VDUMQdgomFRgjpFhYC9ip0ORDO5VSTau-0-f95b57312de5673f6395430f4eb0688b)
1. 列表推导式和循环语句for
如果要将一个数字列表中的元素均扩大2倍组成新列表,利用循环语句,我们可以这样做:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image104.jpg?sign=1738957414-7XlxBxDXGg6nNIZCTIJTr7ybHaomeP7q-0-76e39469042fc74633e7aa2ae69a1965)
而利用列表推导式,我们可以这样做:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image105.jpg?sign=1738957414-b5NasyRFz68hawMOOCJLOiTvplFTVTV4-0-5b6eb40efe84695a60b8763b7e1831d8)
不难看出,利用列表推导式更加简洁。由于Python内部对列表推导式做了大量优化,还能保证较快的运行速度。
当然,for循环可以嵌套。列表推导式中也可以有多个for语句。
如果要将一个一层嵌套数字列表中的元素展开后扩大2倍组成新列表,利用循环嵌套语句,我们可以这样做:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image106.jpg?sign=1738957414-jOvrYc0fYKXfS5cmylV1nkf4ngiDFHZe-0-96368416aebe4ad6e84a1e52b78e9be6)
利用列表推导式,我们可以这样做:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image107.jpg?sign=1738957414-M1ZzcPmxi8WSC5Ud5zrMaYCFpjYdqAjs-0-6b4543d1a62df69d3e3fa2dd9af2ba40)
2. 列表推导式和条件语句if
在列表推导式中,条件语句if对可迭代(Iterable)对象中的元素进行筛选,起到过滤的作用。
接着上面的例子,如果是将一个数字列表中的是正数的元素扩大2倍组成新列表,利用列表推导式,我们可以这样做:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image108.jpg?sign=1738957414-GjjyqhhteSL5Y1yZ08M0sTu6NRJDrSUx-0-6212cb495f40d0e8ca539d7bb9918c40)
另外,在列表推导式中还可以使用if-else语句。
将一个数字列表中的正偶数扩大2倍、正奇数扩大3倍组成新列表,利用列表推导式,我们可以这样做:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image109.jpg?sign=1738957414-vvrZqhjykWf7J1jt9YqNPzGC0cDbjuNF-0-83756a8700dc35cab1b2265a9d8e50d9)
【例4-10】 现有一产品1~31日的销售量如下:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image110.jpg?sign=1738957414-NYD66If2dsh1HKPgpQbUgjlRJ4bc4fUY-0-d5bf903a69c6df37245c2f78848edb23)
请找出最大销量以及销售日输出。请用列表推导式完成。
程序代码:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image111.jpg?sign=1738957414-F9ylNA2M3S85Bv0XaURtR4cttgVdahcJ-0-28b6c3e61202597cef78e857a7daaf14)
程序运行结果:
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image112.jpg?sign=1738957414-bgqk2WdTIqNHvV4wVi1Qr1LH7A10tMtc-0-492b0fcac92e616d2f755a1cef5021ee)
3. 列表推导式和函数function
在列表推导式中可以使用函数function。
利用列表推导式快速生成包含15个30~80(包含30、80)之间的随机整数列表rlist。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image113.jpg?sign=1738957414-wEkQbjhwQOvTt0kZkMO0XbLVwd6o0Mxn-0-fd0d34bb9c520e8bda2b366101143cd3)
对rlist中的元素,如果被3整除则该数除以3,如果被7整除则该数扩大2倍,其他的数扩大5倍,这些数组成新列表number。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image114.jpg?sign=1738957414-oPTKWzZzdCZMAXLNBnMAptUeDy1oGHNL-0-ffe4b696a4d8d89707d18947079b94bc)
4. 同时遍历多个列表或可迭代对象
有两个成绩列表score1和score2,将score1中分数为90及以上和score2中分数为85及以下的元素两两分别组成元组,将这些元组组成列表nn中的元素。
![](https://epubservercos.yuewen.com/8599B6/18562449808364906/epubprivate/OEBPS/Images/image115.jpg?sign=1738957414-8gTFQK1WAXf918Y58JWyHEjo17WOlv30-0-3a5b9f4d42f4541286a059f7ec995051)