朋友们,如需转载请标明出处: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]

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

>>>[x ** 2 for x in range(10) if x % 2 == 0]

[0,4,16,36,64]

上面我们收集了从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]

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

[ expression for target1 in iterable1 [if condition1]

             for target2 in iterable2 [if condition2] ...

             for targetN in iterableN [if conditionN] ]

当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]

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

>>>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]

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

>>>[(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)]

这个表达式排列了从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)]

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

09-11 07:49