4.5.1 列表推导式
列表推导式(list comprehension)是Python开发时用得最多的技术之一,表示对可迭代(Iterable)对象的元素进行遍历、过滤或再次计算,生成满足条件的新列表。它的结构是在一个中括号里包含一个函数或表达式(再次计算),接着是一个for语句(遍历),然后是0个或多个for(遍历)或者if语句(过滤),在逻辑上等价于循环语句,但是形式上更简洁。
语法形式:
1. 列表推导式和循环语句for
如果要将一个数字列表中的元素均扩大2倍组成新列表,利用循环语句,我们可以这样做:
而利用列表推导式,我们可以这样做:
不难看出,利用列表推导式更加简洁。由于Python内部对列表推导式做了大量优化,还能保证较快的运行速度。
当然,for循环可以嵌套。列表推导式中也可以有多个for语句。
如果要将一个一层嵌套数字列表中的元素展开后扩大2倍组成新列表,利用循环嵌套语句,我们可以这样做:
利用列表推导式,我们可以这样做:
2. 列表推导式和条件语句if
在列表推导式中,条件语句if对可迭代(Iterable)对象中的元素进行筛选,起到过滤的作用。
接着上面的例子,如果是将一个数字列表中的是正数的元素扩大2倍组成新列表,利用列表推导式,我们可以这样做:
另外,在列表推导式中还可以使用if-else语句。
将一个数字列表中的正偶数扩大2倍、正奇数扩大3倍组成新列表,利用列表推导式,我们可以这样做:
【例4-10】 现有一产品1~31日的销售量如下:
请找出最大销量以及销售日输出。请用列表推导式完成。
程序代码:
程序运行结果:
3. 列表推导式和函数function
在列表推导式中可以使用函数function。
利用列表推导式快速生成包含15个30~80(包含30、80)之间的随机整数列表rlist。
对rlist中的元素,如果被3整除则该数除以3,如果被7整除则该数扩大2倍,其他的数扩大5倍,这些数组成新列表number。
4. 同时遍历多个列表或可迭代对象
有两个成绩列表score1和score2,将score1中分数为90及以上和score2中分数为85及以下的元素两两分别组成元组,将这些元组组成列表nn中的元素。