Python 列表推导式练习:映射、筛选与构建
推导式是构建集合的紧凑写法。真正该问的不是“能不能写短”,而是“转换是否仍然一眼可见”。
映射每个值
for 前面的表达式会为每个元素求值,结果是一个新列表。表达式要短到读者一眼能看出输入和输出。
nums = [1, 2, 3]
doubled = [n * 2 for n in nums]
print(doubled)转换每个元素
先筛选,再转换
末尾的 if 子句只保留通过测试的值,条件放在 for 子句之后。如果条件需要多个分支,普通循环更合适。
nums = [1, 2, 3, 4]
even = [n for n in nums if n % 2 == 0]
print(even)保留偶数值
构建字典
字典推导式在 for 前使用 键: 值。需要同时拿到原键和值时,遍历 items()。结果是新字典,不会修改原字典。
prices = {"latte": 4.5, "tea": 3.0}
expensive = {name: price for name, price in prices.items() if price >= 4}
print(expensive)筛选字典
一个表达式里的嵌套循环
嵌套推导式从左到右读,就像嵌套的 for 循环。第一个 for 是外层循环。顺序不好解释时,先写普通循环再对比。
pairs = [(x, y) for x in [1, 2] for y in [3, 4]]
print(pairs)小型的笛卡尔积
可读性优先于技巧
推导式应该替代循环,而不是把循环藏起来。如果表达式里需要注释,或者读者要读两遍,就改用命名函数或普通循环。短不等于清楚。
names = ["latte", "tea"]
labels = [name.upper() for name in names if len(name) > 3]
print(labels)短而可读的筛选
你的练习清单
- 不确定时先写出等价的 for 循环。
- if 筛选放在 for 子句之后。
- 输出键值对时使用字典推导式。
- 表达式要短到能一次读完。
常见问题
推导式比循环快吗?
简单转换可能更快,但对初学者来说可读性更重要。只有性能真的成为问题时才做测量。
可以用推导式产生副作用吗?
可以,但含义不清楚。目标是打印、保存或修改外部状态时,用普通 for 循环。
列表推导式和生成器表达式有什么区别?
列表推导式会立即构建完整列表;生成器表达式按需产生值,处理大数据时可能更省内存。
练习推导式
12 道题,覆盖映射、筛选、字典推导式和嵌套循环。
继续阅读: