列表推导式

1、最简单的

[表达式 for 变量 in 列表] 
[out_exp_res for out_exp in input_list]
【结果
(循环)条件】
>>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
>>> new_names = [name.upper()for name in names if len(name)>3]
>>> print(new_names)
['ALICE', 'JERRY', 'WENDY', 'SMITH']
或者 

[表达式 for 变量 in 列表 if 条件]
[out_exp_res for out_exp in input_list if condition]
结果(循环)条件+if条件
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]:
此格式中,[if 条件表达式] 不是必须的,可以使用,也可以省略。

通过列表推导式的语法格式,明显会感觉到它和 for 循环存在某些关联。

其实,除去 [if 条件表达式] 部分,其余各部分的含义以及执行顺序和 for 循环是完全一样的(表达式其实就是 for 循环中的循环体),即它的执行顺序如下所示:

 
  • out_exp_res:列表生成元素表达式,可以是有返回值的函数。
  • for out_exp in input_list:迭代 input_list 将 out_exp 传入到 out_exp_res 表达式中。
  • if condition:条件语句,可以过滤列表中不符合条件的值。
>>> multiples = [i for i in range(30) if i % 3 == 0]
>>> print(multiples)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

2、带多个循环

另外,以上所看到的列表推导式都只有一个循环,实际上它可使用多个循环,就像嵌套循环一样。例如如下代码:

d_list = [(x, y) for x in range(5) for y in range(4)]
# d_list列表包含20个元素
print(d_list)

上面代码中,x 是遍历 range(5) 的迭代变量(计数器),因此该 x 可迭代 5 次;y 是遍历 range(4) 的计数器,因此该 y 可迭代 4 次。因此,该(x,y)表达式一共会迭代 20 次。上面的 for 表达式相当于如下嵌套循环:

dd_list = []
for x in range(5):
for y in range(4):
dd_list.append((x, y))

输出结果:
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2
————————————————
版权声明:本文为CSDN博主「一个写湿的程序猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_32727095/article/details/118959610

当然,也支持类似于三层嵌套的 for 表达式,例如如下代码:

e_list = [[x, y, z] for x in range(5) for y in range(4) for z in range(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, 121]
src_b = [3, 5, 7, 11]
# 只要x能整除y,就将它们配对在一起
result = [(x, y) for x in src_a for y in src_b if x % y == 0]
print(result)

输出结果:
[(30, 3), (30, 5), (12, 3), (66, 3), (66, 11), (39, 3), (78, 3), (36, 3),
————————————————
版权声明:本文为CSDN博主「一个写湿的程序猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_32727095/article/details/118959610

 

3、带if和else

[exp1 if condition else exp2 for x in data]

此处if...else主要起赋值作用,当data中的数据满足if条件时将其做exp1处理,否则按照exp2处理,最后统一生成为一个 数据列表

a=['' if i==0 else '' if i==3 else '' if i==5 else i for i in range(20) ]
print(a)

将0,3,5换成中文的零,三,五,输出如下所示:

4、列表去重放入新列表

这两天遇到这个一个问题,因为一个列表嵌套字典,当时字典数据通过循环加入,发现update后覆盖了原数据,于是改成列表,但是却发现本该有4组数据的却成了6组数据,于是要进行去重操作

但是写列表推导式的时候,尝试好几次都未能得出正确结果,,最终在交流群里别人给出了意见,得到了写法

示例:data_list = [{"name": "小蓝", "age": "18"}, {"name": "小红", "age": "18"},  {"name": "小蓝", "age": "18"}]
要进行去重
最终写成
[list1.append(i) for i in data_list if i not in list1]  # 这个可以

 

posted @ 2023-11-11 22:14  琉璃星眸  阅读(8)  评论(0编辑  收藏  举报