Python组合数据类型----5.2列表(5.2.6)

6 阅读4分钟

六、列表推导式

列表推导式是符合Python语法规则的复合表达式,用于以简洁的方式根据已有的列表构建满足特定需求的列表。基本列表推导式的语法格式如下:

[表达式 for 临时变量 in 目标对象]

以上语法格式由表达式及其后面的 for 语句组成,其中 for 语句用于遍历目标对象,并将每次遍历到的元素赋给临时变量,目标对象必须是一个可迭代对象,例如列表、字符串、元组等;表达式用于在每次循环中对临时变量进行处理或者计算,它可以是任何有效的、包含运算符的表达式,也可以是变量或者常量。

当程序执行列表推导式时,首先会创建一个空列表,然后执行 for 语句遍历目标对象的元素,在每次循环中将遍历到的元素赋给临时变量,之后执行表达式,将表达式的处理或计算结果添加到列表中,最后返回生成的新列表。

例如,使用列表推导式创建一个列表,该列表中的每个元素的值是另一个列表中每个元素的值的平方,示例代码如下:

ls = [1, 2, 3, 4, 5, 6, 7, 8]
ls = [data * data for data in ls]
print(ls)

运行代码,结果如下所示:

[1, 4, 9, 16, 25, 36, 49, 64]

除了上面介绍的语法格式外,还可以结合 if-else 语句或 for 循环嵌套构成比较复杂的列表推导式,进而更灵活地生成列表。下面对一些复杂的列表推导式进行介绍。

1、带 if 语句的列表推导式

在基本列表推导式的 for 语句之后添加一个 if 语句,就组成了带 if 语句的列表推导式,其语法格式如下:

[表达式 for 临时变量 in 目标对象 if 判断条件]

以上列表推导式的执行过程是,先遍历目标对象,然后将遍历到的元素赋给临时变量,若临时变量的值符合判断条件,则按表达式对其进行处理或计算,并将处理或计算后的结果添加到新列表中。

例如,通过带 if 语句的列表推导式构建一个新列表,新列表中只保留列表 ls 中大于 4 的元素,具体代码如下:

new_ls = [temp for temp in ls if temp > 4]
print(new_ls)

运行代码,结果如下所示:

[9, 16, 25, 36, 49, 64]
2、带 if-else 语句的列表推导式

在基本列表推导式的 for 语句之前添加一个 if-else 语句,就组成了带 if-else 语句的列表推导式,其语法格式如下:

[表达式 1 if 判断条件 else 表达式 2 for 临时变量 in 目标对象]

以上列表推导式的执行过程是,先遍历目标对象,然后将遍历到的元素赋给临时变量,若临时变量的值符合判断条件,则按表达式 1 对其进行处理或计算,否则按表达式 2 对其进行处理或计算,并将处理或计算后的结果添加到新列表中。

例如,通过带 if-else 语句的列表推导式构建一个新列表,新列表中保留列表 ls 中值为偶数的元素,以及值为奇数的元素加 1 的结果,具体代码如下:

new_ls = [temp if temp % 2 == 0 else temp + 1 for temp in ls]
print(new_ls)

运行代码,结果如下所示:

[2, 4, 10, 16, 26, 36, 50, 64]
3、带for循环嵌套的列表推导式

在基本列表推导式的 for 语句之后添加一个 for 语句,就组成了带 for 循环嵌套的列表推导式,其语法格式如下:

[表达式 for 临时变量 1 in 目标对象 1 for 临时变量 2 in 目标对象 2]

以上语法格式中的 for 语句按从左至右的顺序分别是外层循环和内层循环。利用上述列表推导式可以根据两个目标对象快速生成一个新的列表。例如,将列表 ls_one 和列表 ls_two 中相同位置的元素相加后的结果作为列表 ls_three 的元素,示例代码如下:

ls_one = [1, 2, 3]
ls_two = [3, 4, 5] 
ls_three = [x + y for x in ls_one for y in ls_two] 
print(ls_three)

运行代码,结果如下所示:

[4, 5, 6, 5, 6, 7, 6, 7, 8]