• 【Python】列表生成式应用的八重境界


    1. 引言

    在Python中有非常多且好用的技巧,其中使用最多的是列表生成式,往往可以将复杂的逻辑用简单的语言来实现,本文重点介绍列表生成式应用的八重境界。
    闲话少说,我们直接开始吧!

    2. Level1: 基础用法

    最最简单的列表生成式,举例如下:

    a = [1, 2, 3]
    b = [n*2 for n in a]
    # b = [2, 4, 6]
    
    • 1
    • 2
    • 3

    上述代码实现了对列表中单个元素求平方的操作。

    3. Level2: 加入条件语句

    其实,我们可以在列表生成式中添加if来获取我们需要的元素,举例如下:

    a = [1, 2, 3, 4, 5]
    b = [n for n in a if n<4]
    # b = [1, 2, 3]
    
    • 1
    • 2
    • 3

    上述代码中,我们添加了一个条件来决定在列表生成式中应该保留哪些元素。这里我们的条件是,如果n<4,则只保留小于4的数。

    4. Level3: 加入 enumerate()

    我们知道,枚举函数enumerate()可以同时生成元素以及相应的元素的索引。如果我们需要元素的索引以及元素,我们可以在列表生成式中使用函数enumerate()
    举例如下:

    a = ["apple", "orange", "pear"]
    b = [(i,fruit) for i,fruit in enumerate(b)]
    # b is [(0,"apple"), (1,"orange"), (2,"pear")]
    
    • 1
    • 2
    • 3

    5. Level4: 加入 zip()

    更进一步,我们知道函数zip()可以非常方便地使我们同时遍历2个或多个列表。
    在列表生成式中加入函数zip(),样例如下:

    a = ["apple", "orange", "pear"]
    a2 = ["pie", "juice", "cake"]
    b = [i+j for i,j in zip(a, a2)]
    # b is ["applepie", "orangejuice", "pearcake"]
    
    • 1
    • 2
    • 3
    • 4

    6. Level5: 加入三目运算符

    三元运算符A if condition else B允许我们根据条件将每个元素转换为其他元素。

    在列表生成式中同样可以使用三目运算符,样例如下:

    a = [56, 45, 76, 23]
    b = [("pass" if n>=50 else "fail") for n in a]
    # b is ["pass", "fail", "pass", "fail"]
    
    • 1
    • 2
    • 3

    7. Level6: 嵌套循环

    其实,我们当然也可以在列表生成式中使用嵌套循环,我们来看个例子,如下:

    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 )
    
    • 1
    • 2
    • 3
    • 4

    8. Level7: 嵌套列表生成式

    更高级一点,我们可以在列表生成式中嵌套列表生成式,举例如下:

    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]]
    
    • 1
    • 2
    • 3

    9. Level8: 合并上述所有技巧

    最后的最后,让我们将上述介绍的几个技巧进行合并,我们来看如下例子:

    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]]
    
    • 1
    • 2
    • 3

    上述实现意义不大,我们尝试应用上了上面介绍的所有技巧,但是毕竟代码可读性太大。其主要目的还是为了说明我们可以结合多种技巧,来使我们的列表生成式实现更加强大的功能。

    10. 应用栗子

    好吧,我们来看个实际的应用例子吧!
    假设我们班级上有如下同学信息:

    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]),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    上述列表展示了每个学生的姓名、性别和考试成绩,这里假设如果一个学生的平均分数≥ 50,那么这个学生有资格获奖。这里我们需要编写代码,来找到上述列表中有资格获奖的男生。
    样例代码如下:

    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')]
    
    • 1
    • 2

    11. 总结

    本文重点介绍了理解Python中的列表生成式的八重境界,并给出了相应的代码示例。

    您学废了嘛?

  • 相关阅读:
    7Z压缩支持加密
    Python股票量化投资课学习—单均线双均线策略
    [WPF]浅析资源引用(pack URI)
    《计算机视觉技术与应用》-----第五章 边缘和轮廓
    2023计算机毕业设计SSM最新选题之java二手交易平台2ud44
    Android图片一直在另一张图的下边
    controller调用service层报错Invalid bound statement (not found)
    Argo项目实战示例:Argo Workflows(when分支,循环,递归等); Argo CD; Argo Events; Argo Rollouts
    【算法】蓝桥杯全攻略:从语言基础到数学算法,一站式解锁竞赛技巧
    GLTF编辑器:在线模型材质编辑工具
  • 原文地址:https://blog.csdn.net/sgzqc/article/details/126650419