朋友们,如需转载请标明出处: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分句在其中进行嵌套(将后来的分句缩进到右边),从而得到等效的语句。得到的结果要长得多,但是也更清晰。