Python列表推导式:让代码像诗一样优雅

52 阅读4分钟

想象一下,你要从一堆水果中挑出所有的苹果并清洗干净。传统做法是:一个个检查,如果是苹果就清洗,然后放到新篮子里。列表推导式就像有个智能助手,你只需要告诉它:"把篮子里所有的苹果洗干净",它就能一次性搞定。

推导式:

简单来说:列表推导式是Python中一种简洁、优雅的创建列表的方法,它把循环和条件判断压缩成一行代码。

传统方式 vs 列表推导式

# 场景1:过滤出偶数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 传统做法 - 像在泥泞中跋涉
even_numbers = []
for num in numbers:
    if num % 2 == 0:
        even_numbers.append(num)
print(f"传统方式: {even_numbers}")

# 列表推导式 - 像乘坐高速电梯
even_numbers = [num for num in numbers if num % 2 == 0]
print(f"推导式方式: {even_numbers}")

# 输出结果都是: [2, 4, 6, 8, 10]

更复杂的例子

# 场景2:处理用户数据
users = [
    {"name": "张三", "age": 25, "vip": True},
    {"name": "李四", "age": 18, "vip": False},
    {"name": "王五", "age": 30, "vip": True},
    {"name": "赵六", "age": 16, "vip": False}
]

# 传统方式 - 冗长
vip_names = []
for user in users:
    if user["vip"] and user["age"] >= 18:
        vip_names.append(user["name"].upper())
print(f"传统方式: {vip_names}")

# 列表推导式 - 简洁
vip_names = [user["name"].upper() for user in users if user["vip"] and user["age"] >= 18]
print(f"推导式方式: {vip_names}")

# 输出结果都是: ['张三', '王五']

列表推导式的语法秘籍

[expression for item in iterable if condition]

分步解释

  1. expression:要对每个元素做什么处理
  2. for item in iterable:从哪里取元素
  3. if condition:满足什么条件才要(可选)

实际应用示例

# 基础应用:数字平方
numbers = [1, 2, 3, 4, 5]
squares = [x * x for x in numbers]
print(f"平方数: {squares}")  # [1, 4, 9, 16, 25]

# 带条件过滤:只处理大于2的数字
big_squares = [x * x for x in numbers if x > 2]
print(f"大于2的平方数: {big_squares}")  # [9, 16, 25]

# 字符串处理:提取首字母
names = ["Alice", "Bob", "Charlie"]
initials = [name[0] for name in names]
print(f"首字母: {initials}")  # ['A', 'B', 'C']

# 多重条件:复杂的过滤逻辑
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
special_numbers = [x for x in numbers if x % 2 == 0 if x > 5]
print(f"特殊数字: {special_numbers}")  # [6, 8, 10]

进阶技巧:让推导式更强大

嵌套循环的推导式

# 传统嵌套循环
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = []
for row in matrix:
    for num in row:
        flattened.append(num)
print(f"传统展开: {flattened}")

# 推导式版本 - 一行搞定!
flattened = [num for row in matrix for num in row]
print(f"推导式展开: {flattened}")

# 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]

使用函数和复杂表达式

# 在推导式中使用函数
def process_score(score):
    """处理分数"""
    if score >= 90:
        return "优秀"
    elif score >= 60:
        return "及格"
    else:
        return "不及格"

scores = [85, 92, 58, 76, 45, 95]
results = [process_score(score) for score in scores]
print(f"成绩评定: {results}")  # ['及格', '优秀', '不及格', '及格', '不及格', '优秀']

# 使用三元表达式
numbers = [1, 2, 3, 4, 5]
labels = ["偶数" if x % 2 == 0 else "奇数" for x in numbers]
print(f"奇偶标签: {labels}")  # ['奇数', '偶数', '奇数', '偶数', '奇数']

字典和集合推导式

# 字典推导式 - 创建字典的快捷方式
names = ["Alice", "Bob", "Charlie"]
name_lengths = {name: len(name) for name in names}
print(f"名字长度字典: {name_lengths}")  # {'Alice': 5, 'Bob': 3, 'Charlie': 7}

# 集合推导式 - 自动去重
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_squares = {x * x for x in numbers}
print(f"唯一平方数: {unique_squares}")  # {16, 1, 9, 4}

什么时候不该用列表推导式?

虽然列表推导式很方便简洁,但也不是所有的情况都适用。在以下情况下,传统的循环可能更合适:

1. 逻辑太复杂时

# 不好的例子 - 推导式太长,难以理解
result = [x * 2 if x % 2 == 0 else x * 3 if x % 3 == 0 else x * 5 for x in range(20) if x > 5 and x < 15]

# 更好的做法 - 使用传统循环,逻辑更清晰
result = []
for x in range(20):
    if x > 5 and x < 15:
        if x % 2 == 0:
            result.append(x * 2)
        elif x % 3 == 0:
            result.append(x * 3)
        else:
            result.append(x * 5)

2. 需要处理异常时

推导式中处理异常会很麻烦,传统循环更合适。

3. 有多个操作时

如果需要对每个元素进行多个不相关的操作,传统循环更清晰

总结:记住这三点就够了

  1. 简洁优雅:列表推导式让代码更短、更易读
  2. 语法简单:记住 [处理 for 元素 in 集合 if 条件] 这个模式
  3. 适度使用:逻辑复杂时还是用传统循环,别为了方便简洁而丢失可读性