📋 Python列表推导式完全指南:从入门到精通的优雅写法

列表推导式(List Comprehension)是Python中最优雅、最Pythonic的特性之一。它能让你用一行代码完成原本需要多行循环才能实现的功能,不仅代码更简洁,执行效率也更高。本文将带你从基础到进阶,彻底掌握这个强大的工具。

一、什么是列表推导式?

列表推导式是一种从现有列表创建新列表的简洁语法。它可以用一行代码替代传统的for循环,让代码更具可读性。

二、基本语法

[expression for item in iterable]

最简单的形式:对可迭代对象中的每个元素执行表达式,收集结果到新列表。

三、实战示例

示例1:生成平方数列表

# 传统方式
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]

示例2:字符串处理

words = ['Hello', 'World', 'Python']
upper_words = [word.upper() for word in words]
print(upper_words)  # ['HELLO', 'WORLD', 'PYTHON']

# 获取字符串长度
lengths = [len(word) for word in words]
print(lengths)  # [5, 5, 6]

四、条件过滤

列表推导式支持if条件筛选,只保留满足条件的元素:

[expression for item in iterable if condition]

示例3:筛选偶数

# 传统方式
evens = []
for x in range(20):
    if x % 2 == 0:
        evens.append(x)

# 列表推导式
evens = [x for x in range(20) if x % 2 == 0]
print(evens)  # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

示例4:复杂条件筛选

# 筛选能被3整除但不能被2整除的数
result = [x for x in range(30) if x % 3 == 0 and x % 2 != 0]
print(result)  # [3, 9, 15, 21, 27]

# 处理字符串列表,只保留长度大于3的单词
words = ['a', 'ab', 'abc', 'abcd', 'abcde']
long_words = [word for word in words if len(word) > 3]
print(long_words)  # ['abcd', 'abcde']

五、嵌套列表推导式

列表推导式支持多层嵌套,处理多维数据:

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# 展开二维列表
flattened = [num for row in matrix for num in row]
print(flattened)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

注意:嵌套推导式的执行顺序是从左到右,等价于:

flattened = []
for row in matrix:
    for num in row:
        flattened.append(num)

六、性能对比

列表推导式不仅代码更优雅,执行速度也更快:

import timeit

# 测试数据量
n = 10000

# 传统for循环
def loop_way():
    result = []
    for i in range(n):
        result.append(i * 2)
    return result

# 列表推导式
def comp_way():
    return [i * 2 for i in range(n)]

# 性能测试
loop_time = timeit.timeit(loop_way, number=1000)
comp_time = timeit.timeit(comp_way, number=1000)

print(f"传统循环: {loop_time:.4f}秒")
print(f"列表推导式: {comp_time:.4f}秒")
print(f"速度提升: {loop_time/comp_time:.2f}倍")

在大多数情况下,列表推导式比传统循环快1.5-2倍,因为推导式在C层面优化执行。

七、其他推导式

Python还支持字典推导式和集合推导式:

字典推导式

words = ['apple', 'banana', 'cherry']
word_lengths = {word: len(word) for word in words}
print(word_lengths)  # {'apple': 5, 'banana': 6, 'cherry': 6}

# 带条件的字典推导式
long_words = {word: len(word) for word in words if len(word) > 5}
print(long_words)  # {'banana': 6, 'cherry': 6}

集合推导式

numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_squares = {x ** 2 for x in numbers}
print(unique_squares)  # {16, 1, 4, 9} - 自动去重

八、注意事项

虽然列表推导式很强大,但也要避免过度使用:

  1. 可读性优先:如果推导式过于复杂,建议使用传统循环
  2. 内存占用:大数据量考虑使用生成器表达式(x for x in data)
  3. 副作用:避免在推导式中执行有副作用的操作(如打印、修改外部变量)

总结

列表推导式是Python的精髓特性之一,掌握它能让你的代码更加Pythonic。核心要点:

  • 基本语法:[expr for item in iterable]
  • 条件过滤:[expr for item in iterable if condition]
  • 多层嵌套从左到右执行
  • 性能优于传统循环
  • 还有字典和集合推导式可用

善用列表推导式,写出简洁、高效、优雅的Python代码!

posted @ 2026-03-23 04:15  码小小小仙  阅读(1)  评论(0)    收藏  举报