如果需要生成一个长度为 3、内容为 0 的列表,可以使用如下的代码来完成这项任务:
list = [0, 0, 0]
如果需要生成一个长度为 100、内容为 0 的列表,使用如上的方式完成,需要在括号中书写 100 个 0,既繁琐又容易出错,显然是不合适的。可以使用动态的方式完成这项任务:
list = []
for i in range(100):
list.append(0)
如果需要生成一个包含 0 到 100 之间(不包括 100)所有的偶数的列表,可以在以上的代码基础上进行修改,如下所示:
list = []
for i in range(100):
if i % 2 == 0:
list.append(i)
在 Python 编程中会碰到大量的创建列表的场景,使用如上的动态添加的方式可以完成这样的需求,但是代码不够简洁。Python 提供了列表推导的语法用于快速的构建一个列表,完成类似如下的任务:
类似的,Python 提供了集合推导的语法用于快速的构建一个集合,以及字典推导的语法用于快速的构建一个字典。
列表推导式对应的英文是 list comprehension,有时也被翻译为列表解析式,是一种创建列表的简洁语法。它的基本语法定义如下:
[expression for item iteratable]
可以认为它使用如下代码创建了一个 list:
list = []
for item iteratable:
list.append(expression)
使用列表推导生成一个包含 4 个整数 0 的列表,代码如下:
>>> [0 for i in range(4)]
[0, 0, 0, 0]
等价于使用 append 方法创建列表,代码如下:
>>> list = []
>>> for i in range(4):
... list.append(0)
...
>>> list
[0, 0, 0, 0]
1.1.3 例子 2
使用列表推导生成一个包含 0 到 4 之间所有整数的列表,代码如下:
>>> [i for i in range(4)]
[0, 1, 2, 3]
代码块
等价于使用 append 方法创建列表,代码如下:
>>> list = []
>>> for i in range(4):
... list.append(i)
...
>>> list
[0, 0, 0, 0]
在基本的列表推导中,将 for 循环遍历的全部元素加入到列表中,可以在 for 循环之后添加 if 语句用于选择元素,它的语法定义如下:
[expression for item iteratable if condition]
可以认为它使用如下代码创建了一个 list:
list = []
for item iteratable:
if condition:
list.append(expression)
注意,在第 3 行,只有满足条件,才会将元素添加到列表中。
使用列表推导生成一个包含 0 到 4 之间所有偶数的列表,使用 if i % 2 == 0 选择将偶数加入到列表,代码如下:
>>> [i for i in range(4) if i % 2 == 0]
[0, 2]
等价于使用 append 方法创建列表,代码如下:
>>> list = []
>>> for i in range(4):
... if i % 2 == 0:
... list.append(i)
...
>>> list
[0, 2]
列表推导中允许 for 循环嵌套,它的语法定义如下:
[expression for x in X for y in Y]
可以认为它使用如下代码创建了一个 list:
list = []
for x in X:
for y in Y:
list.append(expression)
使用列表推导生成一个包含两个字符的字符串列表,代码如下:
>>> [x + y for x in 'ABC' for y in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
等价于使用 append 方法创建列表,代码如下:
>>> list = []
>>> for x in 'ABC':
... for y in 'XYZ':
... list.append(x + y)
...
>>> list
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
>>> [0 for i in range(10)]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> list = [1, 2, 3]
>>> [i*10 for i in list]
[10, 20, 30]
>>> list = ['www', 'imooc', 'com']
>>> [i.upper() for i in list]
['WWW', 'IMOOC', 'COM']
>>> list = [-1, 1, -2, 2, -3, 3]
>>> [i for i in list if i > 0]
[1, 2, 3]
>>> M = 2
>>> N = 3
>>> matrix = [[0 for col in range(N)] for row in range(M)]
>>> matrix
[[0,0,0], [0,0,0]]
>>> matrix = [[1,2,3],[4,5,6]]
>>> matrix2 = [matrix[row][col] for row in range(2) for col in range(3)]
>>> matrix2
[1,2,3,4,5,6]
列表推导用于快速生成一个列表,类似的,Python 同时提供了集合推导用于快速生成一个集合,语法如下:
{expression for item iteratable}
可以认为它使用如下代码创建了一个集合:
s = set()
for item iteratable:
s.add(expression)
与列表推导类似,集合推导也支持 if 语句进行选择,语法如下:
{expression for item iteratable if condition}
可以认为它使用如下代码创建了一个集合:
s = set()
for item iteratable:
if condition:
s.add(expression)
注意,在第 3 行,只有满足条件,才会将元素添加到集合中。
>>> {i for i in range(10)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> set = {1, 2, 3}
>>> {i*10 for i in set}
{10, 20, 30}
>>> set = {'www', 'imooc', 'com'}
>>> {i.upper() for i in set}
{'WWW', 'IMOOC', 'COM'}
>>> set = {-1, 1, -2, 2, -3, 3}
>>> {i for i in list if i > 0}
{1, 2, 3}
>>> {x + y for x in 'ABC' for y in 'XYZ'}
{'AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'}
列表推导用于快速生成一个列表,类似的,Python 同时提供了字典推导用于快速生成一个字典,语法如下:
{key:value for item iteratable}
可以认为它使用如下代码创建了一个字典:
dict = {}
for item iteratable:
dict[key] = value
与列表推导类似,字典推导也支持 if 语句进行选择,语法如下:
{expression for item iteratable if condition}
可以认为它使用如下代码创建了一个集合:
dict = {}
for item iteratable:
if condition:
dict[key] = value
注意,在第 3 行,只有满足条件,才会将元素添加到字典中。
>>> list = ['www', 'imooc', 'com']
>>> {i:i.upper() for i in list}
{'www': 'WWW', 'imooc': 'IMOOC', 'com': 'COM'}
>>> all_students = {'tom': 95, 'jerry': 80, 'mike': 99, 'john': 70}
>>> good_students = {item[0]:item[1] for item in all_students.items() if item[1] > 90}
>>> good_students
{'tom': 95, 'mike': 99}
>>> all_students = {'tom': 95, 'jerry': 80, 'mike': 99, 'john': 70}
>>> good_students = {name:grade for name,grade in all_students.items() if grade > 90}
>>> good_students
{'tom': 95, 'mike': 99}
推导式这种方式能都快速帮我们生成我们想要的列表,集合或者字典等等。极大的加快了我们的开发速度。假如你是一位测试人员,需要大量的假数据来测试程序,这个时候推导式这种方式就很适合你。