列表推导式也称列表解析式,可以使用非常简洁的方式对列表或其他可迭代对象的元素进行遍历,再次计算,快速生成满足特定需求的新列表,代码非常简洁,具有很强的可读性,是Python程序开发时应用最多的技术之一。
Python的内部实现对列表推导式做了大量的优化,可以保证很快的运行速度,也是推荐使用的一种技术。
列表推导式的语法形式为: [expression for expr1 in sequence1 if condition1 for expr2 in sequence2 if condition2 for expr3 in sequence3 if condition3 … … for exprN in sequenceN if conditionN] 列表推导式在逻辑上等价于一个循环语句,只是形式上更加简洁。 等价于:
接下来再通过几个示例来进一步展示列表推导式的强大功能。 1.实现嵌套列表的平铺 在这个列表推导式中有两个循环,其中第一个循环可以看作外循环,执行得慢;第二个循环可以看作内循环,执行得快。上面代码的执行过程等价于下面的写法: 2.过滤不符合条件的元素 在列表推导式中可以使用if子句对列表中的元素进行筛选,只在结果列表中保留符合条件的元素。
示例: 下面的代码用于从列表中选择符合条件的元素组成新的列表。 1.筛选出列表中大于0的数字。 再比如:已知有一个包含一些同学成绩的字典,现在需要计算所有成绩的最高分、最低分、平均分,并查找所有最高分的同学,代码可以这样编写: 2.使用列表推导式查找列表中最大元素的所有位置。 3.同时遍历多个列表或可迭代对象
对于包含多个循环的列表推导式,一定要清楚多个循环的执行顺序或“嵌套关系”。例如,上面的列表推导式等价于: 等价于
4.使用列表推导式实现矩阵转置
对于嵌套了列表推导式的列表推导式,一定要清楚其执行顺序。例如,上面的列表推导式的执行过程等价于下面的代码。
如果把内层的列表推导式也展开,完整的执行过程可以通过下面的代码来模拟:
当然,也可以使用内置函数zip()和list()来实现矩阵转置: 更简单。 5.列表推导式中可以使用函数或复杂表达式
7.使用列表推导式生成100以内的所有素数
参考来源:Python程序设计基础(第2版)董付国 编著