跳转到主要内容
模块 6 · 第 1 课(共 4)课程中的21/36~12 min
模块课程(1/4)

列表理解

列表理解是一个通过应用构建列表的表达式 到可迭代的转换(以及可选的过滤器)。这是 在单行上编写 for + append 的 Pythonic 方式。

Python
# stile imperativo (verboso)
quadrati = []
for n in range(5):
    quadrati.append(n * n)

# stile pythonico
quadrati = [n * n for n in range(5)]
# [0, 1, 4, 9, 16]

完整语法

Python
[espressione for elemento in iterabile if condizione]
  • 表达式:将什么放入结果列表中
  • for element in iterable: 源循环
  • if条件(可选):仅保留匹配的元素
Python
pari = [n for n in range(10) if n % 2 == 0]
# [0, 2, 4, 6, 8]

maiuscole = [p.upper() for p in ["ciao", "mondo"]]
# ['CIAO', 'MONDO']

lunghe = [p for p in ["a", "bb", "ccc", "dddd"] if len(p) >= 3]
# ['ccc', 'dddd']

表达式内的 if/else(三元)

要有条件地转换(而不是过滤器),请使用三元 for 之前的表达式:

Python
[n if n > 0 else 0 for n in [-2, -1, 0, 1, 2]]
# [0, 0, 0, 1, 2]

多用于:笛卡尔积

您可以嵌套多个 for 子句:

Python
coppie = [(x, y) for x in range(3) for y in range(2)]
# [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]

for 子句的顺序是“outer-before-inner”,就好像它们是 嵌套循环。

何时不使用理解式

  • 具有许多嵌套 if/else 分支的复杂逻辑 → 使用显式循环。
  • 副作用(打印、文件写入)→ 循环,而不是理解。
  • 超过 2 个嵌套级别 → 显式命名循环几乎总是更好。

嵌套列表理解

您可以在单个列表理解中链接多个 for 循环。例如,要将矩阵(列表列表)展平为单个平面列表,您可以编写:

Python
matrix = [[1, 2], [3, 4]]
flat = [item for row in matrix for item in row]
# result: [1, 2, 3, 4]

循环的顺序完全反映了传统 for 循环的嵌套顺序。

尝试一下

锻炼#python.m6.l1.e1
尝试:0加载中...

给定“nums = [1, 2, 3, 4, 5, 6]”,用偶数的平方构建“even_squares”。评估“even_squares”。

正在加载编辑器...
显示提示

如果最后 n % 2 == 0 。

3 次尝试后可用的解决方案

复习练习

锻炼#python.m6.l1.e2
尝试:0加载中...

给定 `words = ['Ciao', 'Mondo', 'Python', 'Java']`,使用每个单词的长度构建 `lengths`,并仅使用短于 5 个字符的单词构建 `short_words`。评估“(长度,短单词)”。

正在加载编辑器...
显示提示

两种不同的理解。

3 次尝试后可用的解决方案

额外的挑战

锻炼#python.m6.l1.e3
尝试:0加载中...

Use a list comprehension to calculate the squares of only the even integers between 1 and 10 inclusive. Store the list in `even_squares` and evaluate it.

正在加载编辑器...
显示提示

使用 range(1, 11) 进行迭代,if x % 2 == 0 进行过滤,x**2 作为表达式。

3 次尝试后可用的解决方案