列表推导式怎么写?

访客 python案例 5

本文目录导读:

  1. 基本语法结构
  2. 逐步示例
  3. 其他类似推导式
  4. 使用建议

列表推导式(List Comprehension)是 Python 中一种非常简洁、高效的创建列表的方式,它通常比使用普通的 for 循环写起来更短,运行速度也更快。


基本语法结构

列表推导式的基本结构如下:

[表达式 for 变量 in 可迭代对象 if 条件]
  • 表达式:对变量进行运算或转换的结果,这个结果会成为新列表中的一个元素。
  • for 变量 in 可迭代对象:循环逻辑,从序列(如列表、字符串、range)中依次取出元素。
  • if 条件:(可选)过滤条件,只有满足条件的元素才会被“表达式”处理。

逐步示例

基础用法:不包含 if 条件

需求: 创建一个包含 0 到 9 平方的列表。

  • 使用普通 for 循环:
    squares = []
    for x in range(10):
        squares.append(x**2)
    print(squares)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  • 使用列表推导式:
    squares = [x**2 for x in range(10)]
    print(squares)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

    解析: 对于 range(10) 中的每个 x,计算 x**2 并放入新列表。

包含 if 条件(过滤)

需求: 创建一个 0 到 9 中偶数的平方的列表。

  • 使用普通 for 循环:
    even_squares = []
    for x in range(10):
        if x % 2 == 0:
            even_squares.append(x**2)
    print(even_squares)  # 输出: [0, 4, 16, 36, 64]
  • 使用列表推导式:
    even_squares = [x**2 for x in range(10) if x % 2 == 0]
    print(even_squares)  # 输出: [0, 4, 16, 36, 64]

    解析: 先通过 if x % 2 == 0 过滤,只留下偶数,然后再进行 x**2 运算。

包含 if-else 条件(三元表达式)

当你需要在表达式中根据条件输出不同的值时,可以把 if-else 写在表达式中。

需求: 将 0 到 9 中的偶数变为其平方,奇数变为其负数。

  • 使用普通 for 循环:
    result = []
    for x in range(10):
        if x % 2 == 0:
            result.append(x**2)
        else:
            result.append(-x)
    print(result)  # 输出: [0, -1, 4, -3, 16, -5, 36, -7, 64, -9]
  • 使用列表推导式:
    result = [x**2 if x % 2 == 0 else -x for x in range(10)]
    print(result)  # 输出: [0, -1, 4, -3, 16, -5, 36, -7, 64, -9]

    注意这里 if-else 的位置: 它放在表达式部分(x**2 if x % 2 == 0 else -x),而不是末尾的过滤条件。

嵌套循环

列表推导式也支持多个 for 循环,等同于普通循环的嵌套。

需求: 将两个列表 ['a', 'b'][1, 2] 组合成笛卡尔积 [('a', 1), ('a', 2), ('b', 1), ('b', 2)]

  • 使用普通嵌套循环:
    pairs = []
    for letter in ['a', 'b']:
        for number in [1, 2]:
            pairs.append((letter, number))
    print(pairs)  # 输出: [('a', 1), ('a', 2), ('b', 1), ('b', 2)]
  • 使用列表推导式:
    pairs = [(letter, number) for letter in ['a', 'b'] for number in [1, 2]]
    print(pairs)  # 输出: [('a', 1), ('a', 2), ('b', 1), ('b', 2)]

    注意: for 循环的顺序与普通嵌套循环一致(外层在前,内层在后)。

对字符串进行操作

需求: 获取一个字符串中所有大写字母。

text = "Hello World! Python is Fun."
uppercase_letters = [char for char in text if char.isupper()]
print(uppercase_letters)  # 输出: ['H', 'W', 'P', 'F']

其他类似推导式

Python 中还有集合推导式字典推导式,语法非常相似,只是把 换成了 :

集合推导式 (Set Comprehension)

  • 使用花括号 。

  • 结果是一个集合(元素唯一,无序)。

  • {表达式 for 变量 in 可迭代对象 if 条件}

    示例: 获取 0 到 9 中偶数的平方,并去重(虽然这里没有重复)。

    squares_set = {x**2 for x in range(10) if x % 2 == 0}
    print(squares_set)  # 输出: {0, 64, 4, 36, 16} (顺序可能不同)

字典推导式 (Dictionary Comprehension)

  • 使用花括号 。

  • 表达式需要返回一个 key: value 对。

  • {key_expression: value_expression for 变量 in 可迭代对象 if 条件}

    示例: 将一个列表的元素作为键,其平方作为值,创建一个字典。

    numbers = [1, 2, 3, 4]
    squares_dict = {x: x**2 for x in numbers}
    print(squares_dict)  # 输出: {1: 1, 2: 4, 3: 9, 4: 16}

生成器表达式 (Generator Expression)

  • 使用小括号 。

  • 结果是一个生成器对象,它不会一次性生成所有元素,而是“惰性求值”(按需生成),非常节省内存

  • (表达式 for 变量 in 可迭代对象 if 条件)

    示例: 计算 0 到 999999 中所有偶数的平方和(用列表推导式会占用大量内存)。

    # 使用生成器 (推荐,节省内存)
    total = sum(x**2 for x in range(1000000) if x % 2 == 0)
    print(total)

使用建议

  1. 保持简洁:当逻辑简单(1-2个循环,1个条件)时,推导式非常优雅,如果逻辑复杂,嵌套层次太多(超过2层循环),使用普通 for 循环可读性更好。
  2. 可读性为主:团队协作时,优先考虑代码是否容易理解,不要为了“炫技”写出过于复杂的推导式。
  3. 性能:在大多数情况下,列表推导式比手动 appendfor 循环稍快。
  4. 大列表用生成器:如果数据量非常大(比如几百万个元素),优先考虑使用生成器表达式 而不是列表推导式 ,以避免内存爆满。

标签: 列表推导式

抱歉,评论功能暂时关闭!