Kodokon kodokon.com

列表推导式与字典推导式

用富有表现力的推导式取代那些用于构建数据的循环,从而转换、筛选并重新索引你的数据。

8 分钟 · 3 题

在 Kodokon 中打开本课

列表推导式把编程中最常见的模式浓缩了起来:通过转换或筛选一个序列来构建列表。它的语法读起来就像一句话:[expression for element in sequence if condition]。它和用 append 的循环结果相同,却只需一行声明式代码,每个 Python 开发者都能一眼认出。

PYTHON
prices = [12.0, 49.9, 5.5, 199.0]

with_tax = [round(p * 1.2, 2) for p in prices]
cheap = [p for p in prices if p < 50]

print(with_tax)  # [14.4, 59.88, 6.6, 238.8]
print(cheap)     # [12.0, 49.9, 5.5]
用表达式做转换,用末尾的 if 做筛选。

字典推导式遵循同样的逻辑,语法是 {key: value for ...}。项目中一个非常常见的用例是:按标识符对一个对象列表重新索引,从此可以即时查找,而不必每次需要时都遍历整个列表。

PYTHON
users = [
    {"id": 7, "name": "Alice"},
    {"id": 12, "name": "Bruno"},
    {"id": 31, "name": "Chloe"},
]

by_id = {u["id"]: u["name"] for u in users}
print(by_id[12])    # Bruno
print(31 in by_id)  # True
按标识符重新索引:专业代码中的经典手法。

if 有两个位置,对应两种不同的角色。放在 for 之后,它负责筛选:被排除的元素不会出现在结果里。放在 for 之前,作为条件表达式(a if condition else b),它为每个元素挑选一个值:此时列表的长度与源序列保持一致。

PYTHON
scores = [45, 82, 67, 91]

labels = ["pass" if s >= 60 else "fail" for s in scores]
print(labels)  # ['fail', 'pass', 'pass', 'pass']
条件表达式转换每一个元素,而不会剔除任何一个。

知识检测

确认你已牢记本课的重点内容。

  1. 在 [x * 2 for x in data if x > 0] 中,if 的作用是什么?
    • 它为每个元素在两个值之间做选择
    • 它做筛选:只保留正数元素
    • 它在遇到第一个负数元素时停止推导
  2. {n: n * n for n in range(3)} 会产生什么?
    • {0: 0, 1: 1, 2: 4}
    • {1: 1, 2: 4, 3: 9}
    • [0, 1, 4]
    • {0, 1, 4}
  3. 什么时候最好把推导式换成传统的循环?
    • 当逻辑变得复杂或出现嵌套时
    • 只要列表超过一百个元素
    • 永远不需要,推导式总是更好