列表推导式
列表推导式提供了一个更简单的创建列表的方法。常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列。
对比下列两种创建数值平方列表的方式:
squares = []
for x in range(5):
squares.append(x**2)
print(squares)
print(x) # 产生了一个变量 x
[0, 1, 4, 9, 16]
4
squares = [y**2 for y in range(5)]
print(squares)
print(y) # 没有多余变量 y
[0, 1, 4, 9, 16]
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-3-c81791cbad54> in <module>
1 squares = [y**2 for y in range(5)]
2 print(squares)
----> 3 print(y) #
NameError: name 'y' is not defined
我们发现,列表推导式简洁漂亮、易读,不会产生多余的变量而可能带来副作用。
列表推导式示例:
[(x, y) for x in [1,2] for y in [1,3] if x != y]
[(1, 3), (2, 1), (2, 3)]
相当于:
_list = []
for x in [1,2]:
for y in [1,3]:
if x != y:
_list.append((x,y))
_list
[(1, 3), (2, 1), (2, 3)]
列表推导式可以使用复杂的表达式和嵌套函数:
from math import pi
[str(round(pi, i)) for i in range(1, 4)]
['3.1', '3.14', '3.142']
嵌套的列表推导式:
matrix = [[1, 2, 3],
[5, 6, 7]]
[[row[i] for row in matrix] for i in range(3)]
[[1, 5], [2, 6], [3, 7]]
相当于:
matrix = [[1, 2, 3],
[5, 6, 7]]
_list = []
for i in range(3):
lst = []
for row in matrix:
lst.append(row[i])
_list.append(lst)
_list
[[1, 5], [2, 6], [3, 7]]
判断语句在前的列表推导式:
[True if i % 2 == 0 else False for i in [1,4,7,9]]
[False, True, False, False]
相当于:
_list = []
for i in [1,4,7,9]:
if i % 2 == 0:
_list.append(True)
else:
_list.append(False)
_list
[False, True, False, False]