• python系列教程214——列表解析与for和if


    朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow

    声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

    列表解析可以在for之后编写一个if分支,用来增加选择逻辑。使用了if分支的列表解析能够当成一种与内置的filter类似的工具,它们会在分支不是真的情况下跳过一些序列的元素。

    这里举一个从0~4选出偶数的例子。这里的filter创建了一个小的lambda函数。另外为了对比,在后面也给出了等效的for循环实现。

    >>>[x for x in range(5) if x % 2 == 0]
    
    [0,2,4]
    
    
    
    
    >>>list(filter((lambda x: x % 2 == 0),range(5)))
    
    [0,2,4]
    
    
    
    
    >>>res = []
    
    >>>for x in range(5):
    
    ...    if x % 2 == 0:
    
    ...       res.append(x)
    
    ...
    
    >>>res
    
    [0,2,4]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    它们都是用了求余(求除法的余数)操作符%来检测该数是否是偶数。如果一个数字除以2以后没有余数,它就一定是偶数。

    >>>[x ** 2 for x in range(10) if x % 2 == 0]
    
    [0,4,16,36,64]
    
    • 1
    • 2
    • 3

    上面我们收集了从0~9的偶数的平方。若在右边的if中得到的是假的话,for循环就会跳过这些数字。这个等效的map调用将需要更多的工作来完成这一部分。我们需要在map迭代中混合filter选择过程,这明显复杂得多。

    >>>list( map((lambda x: x**2),filter((lambda x: x % 2 == 0),range(10))) )
    
    [0,4,16,36,64]
    
    • 1
    • 2
    • 3

    实际上,你可以在一个列表解析中编写任意数量的嵌套的for循环,并且每一个都有可选的关联的if分支。通用的列表解析的结构如下所示。

    [ expression for target1 in iterable1 [if condition1]
    
                 for target2 in iterable2 [if condition2] ...
    
                 for targetN in iterableN [if conditionN] ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    当for分句嵌套在列表解析中时,它们工作起来就像等效的嵌套的for循环语句。例如,如下代码。

    >>>res = [x + y for x in [0,1,2] for y in [100,200,300]]
    
    >>>res
    
    [100,200,300,101,201,301,102,202,302]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    与下文如此冗长的代码有相同的效果。

    >>>res = []
    
    >>>for x in [0,1,2]:
    
    ...    for y in [100,200,300]:
    
    ...        res.append(x + y)
    
    ...
    
    >>>res
    
    [100,200,300,101,201,301,102,202,302]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    下面是个更加复杂的列表解析。

    >>>[(x,y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]
    
    [(0,1),(0,3),(2,1),(2,3),(4,1),(4,3)]
    
    • 1
    • 2
    • 3

    这个表达式排列了从0~4的偶数与从0~4的奇数的组合。其中if分句过滤出了每个序列中需要进行迭代的元素。这里是一个等效的用语句编写而成的代码:

    >>>res = []
    
    >>>for x in range(5):
    
    ...     if x % 2 == 0:
    
    ...       for y in range(5):
    
    ...           if y % 2 == 1:
    
    ...               res.append((x,y))
    
    ...
    
    >>>res
    
    [(0,1),(0,3),(2,1),(2,3),(4,1),(4,3)]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    记住!如果你对一个复杂的列表解析有什么困惑的话,你可以将列表解析的for和if分句在其中进行嵌套(将后来的分句缩进到右边),从而得到等效的语句。得到的结果要长得多,但是也更清晰。

  • 相关阅读:
    BI与SaaS碰撞,让数据处理更加轻松(下)
    Java 线程安全的集合有哪些?
    基于高端全闪存存储在医院中的应用与探索
    商家WiFi小程序-2022年火爆副业轻创业项目
    delete、drop、truncate三兄弟
    “微信小号”注册攻略!无需绑定手机号也能注册一个新微信
    风光储一体化园区 | 图扑新能源可视化
    09- 诊断事件的定义
    十天学完基础数据结构-第九天(堆(Heap))
    2023年中国纯棉纱行业现状及发展前景分析[图]
  • 原文地址:https://blog.csdn.net/jiangjunshow/article/details/132791644