Python列表推导式(for表达式)及用法

for 表达式(列表推导式)用于利用其他范围、元组、列表等可迭代对象创建新列表。
for 表达式语法格式如下:
[表达式for循环计数器in可迭代对象]
从上述语法格式可以看出,for 表达式与普通 for 循环有两个区别:
在 for 在定义表达式之前,关键字通常包含循环计数器。
for 表达式没有循环体,所以不需要冒号。
for 当然,表达式也有循环,它也会循环可迭代对象,可迭代对象包含几个对象,这个循环是对的 for 之前执行过几次“表达式”(相当于 for 以前的表达式是循环体),每次执行的值作为新的列表元素收集。
for 列表最终返回表达式,因此 for 表达式也称为列表推导式。
例如,以下代码(程序1):
a_range=range(10) #对a_range执行for表达式 a_list=[x*xforxina_range] #a_list集合包含10个元素 print(a_list)
上面的粗体字代码将是对的 a_range 因为。执行迭代 a_range 相当于包含 10 因此,程序生成的个元素 a_list 同样包含 10 一个元素,每一个元素都是一个元素 a_range 每个元素的平方(由表达式) x*x 控制)。
运行上述代码时,可以看到以下输出结果:
[0,1,4,9,16,25,36,49,64
还可以在 for 添加后面的表达式 if 条件,这样 for 表达式只会迭代符合条件的元素。例如,代码如下:
b_list=[x*xforxina_rangeifx%2==0] #a_list集合包含5个元素 print(b_list)
第一行代码和程序1 3 行代码大致相同,只是为了 for 增加了表达式 if 这样,程序只处理条件 range 因此,程序生成了范围的偶数 b_list 只包含 5 个元素。
运行上述代码时,可以看到以下输出结果:
[0,4,16,36,64]
如果将 for 表达式方括号改为圆括号,for 表达式将不再生成列表,而是生成生成器(generator),该生成器也可以使用 for 循环选代。
使用圆括号 for 表达式,它最终回到了生成器,所以这个 for 表达式也被称为生成器推导式。例如,代码如下:
#使用for表达式创建生成器 c_generator=(x*xforxina_rangeifx%2==0) #使用for循环迭代生成器 foriinc_generator: print(i,end='\t') print()
程序中,第 2 行代码只是将 for 表达式的方括号改为圆括号,因此该代码将创建一个 generator 对象,下一个程序使用 for 这个循环已经过去了 generator 对象。操作上述程序,得到以下输出结果:
04163664
前面看到的 for 表达式只有一个循环,其实只有一个循环。 for 像嵌套循环一样,表达式可以使用多个循环。例如,代码如下:
d_list=[(x,y)forxinrange(5)foryinrange(4)] #d_list列表包含20个元素 print(d_list)
上面代码中 x 是遍历 range(5) 所以这是计数器 x 可迭代 5 次;y 是遍历 range(4) 所以这是计数器 y 可迭代 4 次。所以,该(x,y)表达式共会迭代 20 次。
运行上述代码时,可以看到以下输出结果:
(0,0),(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(1,3),(2,0),(2,1),(2,2),(2,3),(3,0),(3,1),(3,2),(3,3),(4,0),(4,1),(4,2),(4,3)
上面的 for 表达式相当于以下嵌套循环:
dd_list=[] forxinrange(5): foryinrange(4): dd_list.append((x,y))
当然,它也支持类似三层嵌套的支持 for 表达式,如以下代码:
e_list=[[x,y,z]forxinrange(5)foryinrange(4)forzinrange(6)] #e_list列表包含120个元素 print(e_list)
包含多个循环的 for 表达式,也可以指定 if 条件。假设我们有一个需求:程序应该将两个列表中的数值按照“能否整除”的关系进行匹配。例如 src_a 列表中包含 30,src_b 列表中包含 5,其中 30 可以整除 5,那么就将 30 和 5 匹配在一起。使用上述要求 for 实现表达式非常简单,例如以下代码:
src_a=[30,12,66,34,39,78,36,57 src_b=[3,5,7,11] #只要y能整除x,就配对在一起 result=[(x,y)forxinsrc_bforyinsrc_aify%x==0] print(result)
运行上述代码时,可以看到以下输出结果:
(3,30),(3,12),(3,66),(3,39),(3,78),(3,36),(3,57),(5,30),(11,66),(11,121))]
