Loading...
墨滴

瀋凣

2021/10/03  阅读:39  主题:极简黑

python笔记18

Python day18

1. 列表推导式

现在有一个列表,并且列表里的每个元素都是数值,请问如何将列表里的每一个元素的值都变成原来的2倍呢?

我们可以利用循环配合下标来修改列表里的元素:

>>> list1 = [123456]
>>> for i in range(len(list1)):
        list1[i] = list1[i] * 2
        
>>> list1
[24681012]

好像不够优雅~
那么有没有一种优雅的方式实现上述的需求呢?

您好,有的
通过列表推导式我们可以以一种非常优雅的方式实现上述需求。

>>> list1 = [123456]
>>> list1 = [i * 2 for i in list1]
>>> list1
[24681012]

这里的优雅并不仅仅是代码量的减少,还体现在运行效率的提升。

列表推导式的效率通常要比循环语句快上一倍左右的速度。这是因为列表推导式在python解释器里是以更快的C语言的速度来运行的。

1.1 语法

[表达式 for 变量 in 序列或迭代对象]

列表推导式在逻辑上相当于一个循环,只是形式更加简洁。

1.1.1 举个栗子

>>> x = [i for i in range(10)]
>>> x
[0123456789]
>>> x = [i + 1 for i in range(10)]
>>> x
[12345678910]

理解了原理之后我们很容易就可以将列表推导式转换成循环:

>>> x = []
>>> for i in range(10):
        x.append(i + 1)
        
>>> x
[12345678910]

处理字符串,列表推导式也不在话下:

>>> y = [i * 2 for i in "qmrobot"]
>>> y
['qq''mm''rr''oo''bb''oo''tt']

提升难度:

>>> matrix = [[123],
              [456],
              [789]]

现在我们要用列表推导式将这个矩阵的第二列的元素提取出来:

>>> col2 = [row[1for row in matrix]
>>> col2
[258]

改变一下思路,我们也不一定非要从for语句里获取什么,比如:
现在我们要获取矩阵组对角线上的数据

>>> diag = [matrix[i][i] for i in range(len(matrix))]
>>> diag
[159]

思考:现在我们要获取从左上角到右下角的对角线数据,用列表推导式该怎么写呢?

>>> diag2 = [matrix[i][len(matrix) - 1 - i] for i in range(len(matrix))]
>>> diag2
[357]

或者是:

>>> diag3 = [matrix[i][-i - 1for i in range(len(matrix))]
>>> diag3
[357]

回到我们最初的例子:

  • for循环实现
>>> list1 = [123456]
>>> for i in range(len(list1)):
        list1[i] = list1[i] * 2
        
>>> list1
[24681012]

  • 列表推导式实现
>>> list1 = [123456]
>>> list1 = [i * 2 for i in list1]
>>> list1
[24681012]

这两种写法的 效果 是完全一样的吗?

答案是: 不一样
for 循环是通过迭代的形式逐个修改原列表中的元素;
列表推导式则是直接创建一个新的列表然后赋值回原先的变量名。

这就好像你有一个女朋友好像不太聪明的样子,for循环是通过耐心的教她读书识字让她变得更好;而列表推导式则是选择直接换个聪明的女朋友,还给她起个前女友的名字···妥妥的渣男!

我们可以通过一个例子就能看出:

>>> x = [1,2,3,4,5,6]
>>> id(x)
2671933741696
>>> for i in range(len(x)):
       x[i] = x[i] * 2

 
>>> x
[24681012]
>>> id(x)
2671933741696
>>> 
>>> y = [1,2,3,4,5,6]
>>> id(y)
2671933929216
>>> y = [i * 2 for i in y]
>>> y
[24681012]
>>> id(y)
2671899539392

这两种操作从根本上来说是完全不一样的,但是从效果上来说列表推导式几乎都可以实现我们的需求。

点点关注不迷路
点点关注不迷路
- END -

瀋凣

2021/10/03  阅读:39  主题:极简黑

作者介绍

瀋凣