介绍
在这个 Lab 中,你将接触到 Python 列表推导式(comprehensions),这是一种特殊的语法,它允许你以非常简洁的方式从其他可迭代对象(iterables)创建数据结构,如列表(lists)、集合(sets)和字典(dictionaries)。当你处理一到两个嵌套的 for 循环时,推导式非常有用,能让你的代码更具可读性,通常也更高效。
你将从最常见的类型——列表推导式开始,并了解它们与传统的 for 循环有何不同。然后,你将学习如何添加条件逻辑来过滤元素或转换它们。最后,你将看到相同的原理如何应用于创建集合和字典。
列表推导式
在这一步中,你将学习列表推导式 (list comprehensions) 的基本语法,它是一种从其他可迭代对象 (iterables) 创建列表的简洁方法。我们将比较传统的 for 循环方法和更优雅的列表推导式语法。
注意: 如果你不熟悉使用 WebIDE (类似 VS Code),请先在 这个实验 中学习。
首先,我们来看一下如何使用标准的 for 循环从一个现有列表中创建一个新列表。
从左侧的文件浏览器中打开 main.py 文件。将以下代码复制并粘贴到文件中:
## 传统方法:使用 for 循环创建列表
names = ['Charles', 'Susan', 'Patrick', 'George']
new_list = []
for n in names:
new_list.append(n)
print(new_list)
要运行代码,请点击终端面板中的 + 图标并选择 "New Terminal" 来打开一个终端。然后,执行以下命令:
python3 main.py
你将看到以下输出:
['Charles', 'Susan', 'Patrick', 'George']
现在,让我们使用列表推导式来实现相同的结果。基本语法是 [expression for item in iterable]。
将 main.py 的内容替换为以下代码:
## 列表推导式:创建新列表的简洁方法
## 语法:[expression for item in iterable]
names = ['Charles', 'Susan', 'Patrick', 'George']
new_list = [n for n in names] ## 使用列表推导式创建包含所有名字的列表
print(new_list)
再次运行脚本:
python3 main.py
输出是相同的,但代码更短且更具描述性。
['Charles', 'Susan', 'Patrick', 'George']
列表推导式也可以处理嵌套循环。例如,要从两个范围 (ranges) 创建一个元组 (tuples) 列表,你可以这样做。
用以下代码更新你的 main.py 文件并运行它。
## 嵌套列表推导式:从两个范围创建元组列表
## 等同于嵌套的 for 循环
n = [(a, b) for a in range(1, 3) for b in range(1, 3)]
print(n)
运行脚本:
python3 main.py
输出将是所有可能的元组组合的列表:
[(1, 1), (1, 2), (2, 1), (2, 2)]
添加条件判断
在这一步,你将探索如何在列表推导式中加入条件逻辑。你将学习如何使用 if 语句来过滤元素,以及如何使用 if-else 结构对每个元素应用条件表达式。
假设我们想创建一个新列表,其中只包含以字母 'C' 开头的名字。使用传统的 for 循环,你需要在循环内部添加一个 if 语句。
使用以下代码更新你的 main.py:
## 传统方法:使用 if 条件进行过滤
names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
new_list = []
for n in names:
if n.startswith('C'): ## 过滤以 'C' 开头的名字
new_list.append(n)
print(new_list)
运行脚本查看结果:
python3 main.py
输出:
['Charles', 'Carol']
要使用列表推导式实现这一点,你需要将 if 语句放在末尾。语法是 [expression for item in iterable if condition]。
在你的 main.py 中尝试这样做:
## 带条件的列表推导式:过滤项目
## 语法:[expression for item in iterable if condition]
names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
new_list = [n for n in names if n.startswith('C')]
print(new_list)
运行它,你将得到相同的过滤后的列表:
python3 main.py
输出:
['Charles', 'Carol']
你也可以使用 if-else 语句对每个元素执行条件操作。在这种情况下,if-else 表达式位于 for 循环的前面。语法是 [expression_if_true if condition else expression_if_false for item in iterable]。
让我们创建一个新列表,将偶数加倍,而奇数保持不变。使用以下代码更新 main.py 并运行它。
## 带 if-else 的列表推导式:条件表达式
## 语法:[expression_if_true if condition else expression_if_false for item in iterable]
nums = [1, 2, 3, 4, 5, 6]
new_list = [num*2 if num % 2 == 0 else num for num in nums] ## 偶数加倍
print(new_list)
运行脚本:
python3 main.py
输出显示只有偶数被加倍了:
[1, 4, 3, 8, 5, 12]
集合推导式
在这一步,你将了解如何应用推导式语法来创建集合(sets)。列表(list)推导式的基础知识同样适用于集合(sets)和字典(dictionaries)。
集合推导式与列表推导式非常相似。主要区别在于它们使用花括号 {} 而不是方括号 [],并且生成一个集合,集合是唯一的元素构成的无序集合。
语法是 {expression for item in iterable}。
让我们从另一个集合创建一个新集合,将其中所有的字符串元素转换为大写。使用以下代码更新你的 main.py 文件:
## 集合推导式:使用推导式语法创建集合
## 语法:{expression for item in iterable}
b = {"abc", "def"}
upper_set = {s.upper() for s in b} ## 将所有字符串转换为大写
print(upper_set)
现在,运行脚本:
python3 main.py
输出将是一个包含大写字符串的新集合。请注意,由于集合是无序的,输出中元素的顺序可能会有所不同。
{'DEF', 'ABC'}
如果原始的可迭代对象包含重复项,结果集合将只包含唯一的元素,因为集合会自动丢弃重复项。
字典推导式
在这一步,你将学习如何使用字典推导式(dictionary comprehensions)来构建字典。与集合推导式类似,它们也使用花括号 {},但它们需要一个由冒号分隔的键值对(key-value pair)。
语法是 {key_expression: value_expression for item in iterable}。
一个常见的用例是通过转换或交换现有字典的键值对来创建一个新字典。让我们尝试交换字典的键和值。
使用以下代码更新你的 main.py 文件:
## 字典推导式:交换键和值
## 语法:{key_expression: value_expression for item in iterable}
c = {'name': 'Pooka', 'age': 5}
swapped_dict = {v: k for k, v in c.items()} ## 反转键值对
print(swapped_dict)
运行脚本:
python3 main.py
输出将是一个新字典,其中原始值现在是键,原始键是值。
{'Pooka': 'name', 5: 'age'}
你也可以使用推导式从字典创建其他数据类型。例如,下面是如何使用列表推导式(list comprehension)从字典的项(items)生成一个格式化字符串列表。
用这个例子替换 main.py 中的代码并运行它:
## 来自字典的列表推导式:创建格式化字符串
c = {'name': 'Pooka', 'age': 5}
formatted_list = ["{}:{}".format(k.upper(), v) for k, v in c.items()] ## 格式化为 "KEY:value"
print(formatted_list)
运行脚本:
python3 main.py
这将生成一个字符串列表,而不是一个字典。
['NAME:Pooka', 'AGE:5']
这展示了使用推导式来处理和转换不同数据结构的灵活性。对于本步骤的最后一项任务,请确保你的 main.py 包含字典交换的代码。
总结
在这个实验(Lab)中,你学习了如何使用 Python 强大的推导式(comprehension)语法,以简洁且易读的方式创建列表(lists)、集合(sets)和字典(dictionaries)。
你从列表推导式开始,了解了它们如何为传统的 for 循环提供更优雅的替代方案。然后,你学习了如何添加条件逻辑,使用尾随的 if 进行过滤,以及使用 if-else 表达式来转换元素。最后,你看到了这些相同的原则如何应用于集合和字典推导式,使用花括号 {} 来构建唯一项的集合和键值对的字典。
推导式是惯用(idiomatic)Python 代码的一个基本组成部分。掌握它们将使你的代码更高效、更优雅。继续练习,使它们成为你 Python 编程工具箱中的自然组成部分。



