1. 引言
在Python中有非常多且好用的技巧,其中使用最多的是列表生成式,往往可以将复杂的逻辑用简单的语言来实现,本文重点介绍列表生成式应用的八重境界。
闲话少说,我们直接开始吧!
2. Level1: 基础用法
最最简单的列表生成式,举例如下:
1
2
3
|
a = [ 1 , 2 , 3 ] b = [n * 2 for n in a] # b = [2, 4, 6] |
上述代码实现了对列表中单个元素求平方的操作。
3. Level2: 加入条件语句
其实,我们可以在列表生成式中添加if来获取我们需要的元素,举例如下:
1
2
3
|
a = [ 1 , 2 , 3 , 4 , 5 ] b = [n for n in a if n< 4 ] # b = [1, 2, 3] |
上述代码中,我们添加了一个条件来决定在列表生成式中应该保留哪些元素。这里我们的条件是,如果n<4,则只保留小于4的数。
4. Level3: 加入 enumerate()
我们知道,枚举函数enumerate()可以同时生成元素以及相应的元素的索引。如果我们需要元素的索引以及元素,我们可以在列表生成式中使用函数enumerate()。
举例如下:
1
2
3
|
a = [ "apple" , "orange" , "pear" ] b = [(i,fruit) for i,fruit in enumerate (b)] # b is [(0,"apple"), (1,"orange"), (2,"pear")] |
5. Level4: 加入 zip()
更进一步,我们知道函数zip()可以非常方便地使我们同时遍历2个或多个列表。
在列表生成式中加入函数zip(),样例如下:
1
2
3
4
|
a = [ "apple" , "orange" , "pear" ] a2 = [ "pie" , "juice" , "cake" ] b = [i + j for i,j in zip (a, a2)] # b is ["applepie", "orangejuice", "pearcake"] |
6. Level5: 加入三目运算符
三元运算符A if condition else B允许我们根据条件将每个元素转换为其他元素。
在列表生成式中同样可以使用三目运算符,样例如下:
1
2
3
|
a = [ 56 , 45 , 76 , 23 ] b = [( "pass" if n> = 50 else "fail" ) for n in a] # b is ["pass", "fail", "pass", "fail"] |
7. Level6: 嵌套循环
其实,我们当然也可以在列表生成式中使用嵌套循环,我们来看个例子,如下:
1
2
3
4
|
a = [ 10 , 20 , 30 ] a2 = [ 1 , 2 , 3 ] b = [i + j for i in a for j in a2] # b is [11, 12, 13, 21, 22, 23, 31, 32, 33] |
实质上,上述实现等价代码如下:
1
2
3
4
|
newlist = [] for i in a: for j in a2: newlist.append( i + j ) |
8. Level7: 嵌套列表生成式
更高级一点,我们可以在列表生成式中嵌套列表生成式,举例如下:
1
2
3
|
a = [ 1 , 2 , 3 ] b = [[i for i in range ( 1 , n + 1 )] for n in a] # b is [[1], [1, 2], [1, 2, 3]] |
9. Level8: 合并上述所有技巧
最后的最后,让我们将上述介绍的几个技巧进行合并,我们来看如下例子:
1
2
3
|
a = [ 1 , 2 , 3 , 4 , 5 ] b = [[xx if xx>yy else yy for xx in range (x) for yy in range (y)] for i,(x,y) in enumerate ( zip (a, a[:: - 1 ])) if i % 2 = = 0 ] # [[0, 1, 2, 3, 4], [0, 1, 2, 1, 1, 2, 2, 2, 2], [0, 1, 2, 3, 4]] |
上述实现意义不大,我们尝试应用上了上面介绍的所有技巧,但是毕竟代码可读性太大。其主要目的还是为了说明我们可以结合多种技巧,来使我们的列表生成式实现更加强大的功能。
10. 应用栗子
好吧,我们来看个实际的应用例子吧!
假设我们班级上有如下同学信息:
1
2
3
4
5
6
7
|
students = [ ( "bob" , "m" , [ 67 , 89 , 60 ]), ( "alice" , "f" , [ 97 , 85 , 61 ]), ( "cassie" , "f" , [ 78 , 91 , 89 ]), ( "tim" , "m" , [ 47 , 57 , 24 ]), ( "tom" , "m" , [ 91 , 79 , 72 ]), ] |
上述列表展示了每个学生的姓名、性别和考试成绩,这里假设如果一个学生的平均分数≥ 50,那么这个学生有资格获奖。这里我们需要编写代码,来找到上述列表中有资格获奖的男生。
样例代码如下:
1
2
|
x = [(name, "eligible" if sum (scores) / len (scores) > = 50 else "not eligible" ) for name,gender,scores in students if gender = = "m" ] #[('bob', 'eligible'), ('tim', 'not eligible'), ('tom', 'eligible')] |
11. 总结
本文重点介绍了理解Python中的列表生成式的八重境界,并给出了相应的代码示例。
以上就是一文带你了解Python列表生成式应用的八重境界的详细内容,更多关于Python列表生成式的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/sgzqc/article/details/126650419