14. Python 中的列表推导

目录
文章目录隐藏
  1. 1. 列表推导
  2. 2. 集合推导
  3. 3. 字典推导
  4. 4. 小结

如果需要生成一个长度为 3、内容为 0 的列表,可以使用如下的代码来完成这项任务:

list = [0, 0, 0]

如果需要生成一个长度为 100、内容为 0 的列表,使用如上的方式完成,需要在括号中书写 100 个 0,既繁琐又容易出错,显然是不合适的。可以使用动态的方式完成这项任务:

list = []
for i in range(100):
    list.append(0)
  • 在第 1 行,创建一个空的列表
  • 在第 2 行,创建一个循环语句,循环 100 次
  • 在第 3 行,在循环中,向列表添加元素 0
  • 最终,list 包含 100 个整数 0

如果需要生成一个包含 0 到 100 之间(不包括 100)所有的偶数的列表,可以在以上的代码基础上进行修改,如下所示:

list = []
for i in range(100):
    if i % 2 == 0:
        list.append(i)
  • 在第 1 行,创建一个空的列表
  • 在第 2 行,创建一个循环语句,循环 100 次
  • 在第 3 行,检查循环变量 i 能否被 2 整除
  • 在第 4 行,如果变量 i 能够被 2 整除,则表示变量 i 是偶数,将其加入到列表中
  • 最终,list 包含 0 到 100 之间的所有的偶数

在 Python 编程中会碰到大量的创建列表的场景,使用如上的动态添加的方式可以完成这样的需求,但是代码不够简洁。Python 提供了列表推导的语法用于快速的构建一个列表,完成类似如下的任务:

  • 生成一个包含 100 个整数 0 的列表
  • 生成一个包含 0 到 100 之间的所有偶数的列表

类似的,Python 提供了集合推导的语法用于快速的构建一个集合,以及字典推导的语法用于快速的构建一个字典。

1. 列表推导

1.1 定义

列表推导式对应的英文是 list comprehension,有时也被翻译为列表解析式,是一种创建列表的简洁语法。它的基本语法定义如下:

[expression for item iteratable]

可以认为它使用如下代码创建了一个 list:

list = []
for item iteratable:
    list.append(expression)
  • 在第 1 行,创建一个空的列表
  • 在第 2 行,创建一个循环语句,遍历 iteratable
  • 在第 3 行,在循环中,向列表添加元素 expression

例子 1

使用列表推导生成一个包含 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]

例子 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]

1.2 条件语句

在基本的列表推导中,将 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]

1.3 for 循环嵌套

列表推导中允许 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']
  • 在第 1 行,创建了一个空列表
  • 在第 2 行,在外循环中,遍历字符串 ‘ABC’ 中的 3 个字符 ‘A’、‘B’ 和 ‘C’,循环变量 x 依次为’A’、‘B’ 和 ‘C’
  • 在第 3 行,在内循环中,遍历字符串 ‘XYZ’ 中的 3 个字符 ‘X’、‘Y’ 和 ‘Z’,循环变量 y 依次为’X’、‘Y’ 和 ‘Z’
  • 在第 4 行,将表达式 x + y 作为元素添加到列表中

1.4 应用举例

  1. 初始化长度为 10 的列表
    >>> [0 for i in range(10)]
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    
  2. 将列表中的元素乘以 10
    >>> list = [1, 2, 3]
    >>> [i*10 for i in list]
    [10, 20, 30]
    
  3. 将列表中所有的字符串变成大写
    >>> list = ['www', 'mybj123', 'com']
    >>> [i.upper() for i in list]
    ['WWW', 'MYBJ123', 'COM']
    
  4. 包含所有的正整数的列表
    >>> list = [-1, 1, -2, 2, -3, 3]
    >>> [i for i in list if i > 0]
    [1, 2, 3]
    
  5. 初始化生成一个 M*N 的矩阵
    >>> M = 2
    >>> N = 3
    >>> matrix = [[0 for col in range(N)] for row in range(M)]
    >>> matrix
    [[0,0,0], [0,0,0]]
    
    • 在第 1 行,设定矩阵的行数 M 为 2
    • 在第 2 行,设定矩阵的列数 N 为 3
    • 在第 3 行,生成一个 2 行 3 列的矩阵
      • [0 for col in range (N)],生成包含 3 个元素的一维向量
      • [[…] for row in range (M)],生成包含 2 个一维向量的矩阵
  6. 将矩阵平坦化
    >>> 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]
    
    • 在第 1 行,生成一个 2 行 3 列的矩阵
      • 矩阵的第 1 行为 [1,2,3]
      • 矩阵的第 2 行为 [4,5,6]
    • 在第 2 行,将矩阵平坦化
      • for row in range (2) 遍历矩阵的行
      • for col in range (3) 遍历矩阵的列
      • matrix [row][col] 获取矩阵中指定位置的元素,将该元素放置在一个列表中
    • 在的 3 行,得到一个平坦化的列表

2. 集合推导

2.1 定义

列表推导用于快速生成一个列表,类似的,Python 同时提供了集合推导用于快速生成一个集合,语法如下:

{expression for item iteratable}

可以认为它使用如下代码创建了一个集合:

s = set()
for item iteratable:
    s.add(expression)
  • 在第 1 行,使用函数 set() 创建一个空的集合
  • 在第 2 行,创建一个循环语句,遍历 iteratable
  • 在第 3 行,在循环中,向集合添加元素 expression

与列表推导类似,集合推导也支持 if 语句进行选择,语法如下:

{expression for item iteratable if condition}

可以认为它使用如下代码创建了一个集合:

s = set()
for item iteratable:
    if condition:
        s.add(expression)

注意,在第 3 行,只有满足条件,才会将元素添加到集合中。

2.2 应用举例

  1. 包含从 0 到 10 之间所有整数的集合
    >>> {i for i in range(10)}
    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    
  2. 将集合中的元素乘以 10
    >>> set = {1, 2, 3}
    >>> {i*10 for i in set}
    {10, 20, 30}
    
  3. 将列表中所有的字符串变成大写
    >>> set = {'www', 'mybj123', 'com'}
    >>> {i.upper() for i in set}
    {'WWW', 'MYBJ123', 'COM'}
    
  4. 包含所有的正整数的集合
    >>> set = {-1, 1, -2, 2, -3, 3}
    >>> {i for i in list if i > 0}
    {1, 2, 3}
    
  5. 包含两个字符的字符串集合
    >>> {x + y for x in 'ABC' for y in 'XYZ'}
    {'AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'}
    

3. 字典推导

3.1 定义

列表推导用于快速生成一个列表,类似的,Python 同时提供了字典推导用于快速生成一个字典,语法如下:

{key:value for item iteratable}

可以认为它使用如下代码创建了一个字典:

dict = {}
for item iteratable:
    dict[key] = value
  • 在第 1 行,创建一个空的字典
  • 在第 2 行,创建一个循环语句,遍历 iteratable
  • 在第 3 行,在循环中,向字典添加键值对

与列表推导类似,字典推导也支持 if 语句进行选择,语法如下:

{expression for item iteratable if condition}

可以认为它使用如下代码创建了一个集合:

dict = {}
for item iteratable:
    if condition:
        dict[key] = value

注意,在第 3 行,只有满足条件,才会将元素添加到字典中。

3.2 应用举例

  1. 创建从小写到大写的映射<
    >>> list = ['www', 'mybj123', 'com']
    >>> {i:i.upper() for i in list}
    {'www': 'WWW', 'mybj123': 'MYBJ123', 'com': 'COM'}
    
  2. 对字典进行筛选
    >>> 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}
    
    • 在第 1 行,创建一个包含 4 个学生的集合,姓名作为键,成绩作为值
      • tom 的成绩为 95 分
      • jerry 的成绩为 80 分
      • mike 的成绩为 99 分
      • john 的成绩为 70 分
    • 在第 2 行,在原有的集合中选择成绩大于 90 分的学生,构造一个新的集合
      • for item in all_students.items (),遍历 all_students
      • 循环变量 item 是一个包含两个元素的元组
        • item [0] 是姓名
        • item [1] 是成绩
      • if item [1] > 90,选择成绩大于 90 分
      • item [0]:item [1],使用 item [0] 作为键,使用 item [] 作为值
  3. 对字典进行筛选
    >>> 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}
    
    • 这个例子与上个例子完成相同的功能,但是使用更简洁的语法
    • 在第 1 行,创建一个包含 4 个学生的集合,姓名作为键,成绩作为值
      • tom 的成绩为 95 分
      • jerry 的成绩为 80 分
      • mike 的成绩为 99 分
      • john 的成绩为 70 分
    • 在第 2 行,在原有的集合中选择成绩大于 90 分的学生,构造一个新的集合
      • for name,grade in all_students.items (),遍历 all_students
      • 循环变量是一个包含两个元素的元组,‘name,grade’ 表示该元组
        • 使用变量 name 表示该元组的第 0 项
        • 使用变量 grade 表示该元组的第 1 项
      • if grade > 90,选择成绩大于 90 分
      • name:grade,使用 name 作为键,使用 grade 作为值

4. 小结

推导式这种方式能都快速帮我们生成我们想要的列表,集合或者字典等等。极大的加快了我们的开发速度。假如你是一位测试人员,需要大量的假数据来测试程序,这个时候推导式这种方式就很适合你。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系maynote@foxmail.com处理
码云笔记 » 14. Python 中的列表推导

发表回复