python高级编程之列表推导式

1. 一个简单的例子

在Python中,如果我们想修改列表中所有元素的值,可以使用for循环语句来实现。

例如,将一个列表中的每个元素都替换为它的平方:

 

python高级编程之列表推导式_第1张图片

另一种优雅的实现方式就是使用列表推导式(List Comprehensions):

 

python高级编程之列表推导式_第2张图片

2. 基本语法

我们具体来分析上面给出的例子

>>> L=[x**2forxinL]

我们将列表推导式写在一个方括号内,因为它最终构建的是一个列表。

列表推导式主要由两部分构成:

循环变量表达式(x ** 2)

for循环头部(for x in L)

是不是非常简单!

3. 工作原理

Python在执行列表推导式时,会对可迭代对象L进行迭代,将每一次迭代的值赋给循环变量x,然后收集变量表达式x ** 2的计算结果,最终由这些结果构成了新的列表,也就是列表推导式所返回的值。

只要支持for循环进行迭代的对象,都可以对它使用列表推导式。

例如,我们将一个字符串进行移位处理:

 

python高级编程之列表推导式_第3张图片

4. 高级语法

除了像上面介绍的[x ** 2 for x in L]这种基本语法之外,列表推导式还有一些高级的扩展。

4.1. 带有if语句

我们可以在for语句后面跟上一个if判断语句,用于过滤掉那些不满足条件的结果项。

例如,我想去除列表中所有的偶数项,保留奇数项,可以这么写:

 

python高级编程之列表推导式_第4张图片

4.2. 带有for嵌套

在复杂一点的列表推导式中,可以嵌套有多个for语句。按照从左至右的顺序,分别是外层循环到内层循环。

例如:

 

4.3. 既有if语句又有for嵌套

列表推导式可以带任意数量的嵌套for循环,并且每一个for循环后面都有可选的if语句。

通用语法:

 

python高级编程之列表推导式_第5张图片

例如,下面的代码输出了0~4之间的偶数和奇数的组合。

 

等价于下面的一般 for 循环:

 

python高级编程之列表推导式_第6张图片

4.4. 列表推导式生成矩阵

生成矩阵的方式有多种,例如手动赋值、一般for循环,还有就是列表推导式。如果我们要用列表推导式生成下面的矩阵,可以怎么写?

 

python高级编程之列表推导式_第7张图片

一种方法是:

 

python高级编程之列表推导式_第8张图片

矩阵的列数少时可以使用这种方法。

如果矩阵的列数较多,我们可以使用另外一种方式:在循环变量的表达式中使用列表推导式。

具体代码如下:

 

 

python高级编程之列表推导式_第9张图片

与之前带for嵌套的语法不同,这个例子中,实际使用的是最基本的[expression for x in L]语法,只有一个for语句。

复杂的地方在于前面的变量表达式expression不再是简单的变量运算,而是一个列表推导式,在这个例子中就是[y for y in range(x, x+3)]。

内层的列表推导式返回一个行向量,而这些行向量经由外层的列表推导式,最终形成一个二维列表,也就是我们想要的矩阵。

当然,在实际的应用中不能单纯追求代码的简洁,还要考虑到代码的可读性和维护成本。

如果代码变得过于复杂,不易于理解,我们宁可多写几行代码来增加它的可读性。

5. 生成器表达式

生成器表达式与列表推导式的语法相同,区别在于生成器表达式的外面使用圆括号,而列表推导式使用方括号。

6. 集合推导式和字典推导式

注意:集合推导式和字典推导式只有在Python2.7以及之后的版本中才有,Python2.7之前的版本不支持这两种推导式。

集合推导式的语法与列表推导式相同,只需要把外面的方括号改成花括号即可。

例如,我们可以通过以下方式来生成一个集合:

 

字典推导式的外面也是使用花括号,不过花括号的内部需要包含键值两部分。

在值不重复的情况下,我们可以通过字典推导式快速交换键值对:

 

python高级编程之列表推导式_第10张图片

总结:

在编写或是阅读这类推导式的时候,一定要注意先从for..in开始,最后再看前面的循环变量表达式。

你可能感兴趣的:(python)