0Pricing
DSA Interview Prep · 课时

推导式与内置函数

使用列表、字典和集合推导式,以及 map、filter、zip、enumerate 和带键函数的 sorted,编写简洁的解法。

推导式与内置函数 是 CoddyKit 上的免费 DSA Interview Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DSA Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DSA Interview Prep 课程共包含 4 节课。

列表推导式:简洁筛选

列表推导式可以将“for 循环加 append”写成简洁的一行:[expr for item in iterable if condition]。它的速度略快,也能体现您对 Python 的熟练程度。

# Traditional loop
squares = []
for n in range(1, 6):
    squares.append(n * n)
print(squares)  # [1, 4, 9, 16, 25]

# List comprehension
squares = [n * n for n in range(1, 6)]
print(squares)  # [1, 4, 9, 16, 25]

# With filter
evens = [n for n in range(10) if n % 2 == 0]
print(evens)    # [0, 2, 4, 6, 8]

使用嵌套推导式构建二维网格

嵌套推导式可以构建二维网格,这是设置 DP 表的标准方式。请避免使用 [[0]*C]*R,因为它会让每一行共享同一个内部列表。代码展示了修正方法。

# WRONG: all rows are the same object!
bad = [[0] * 3] * 3
bad[0][0] = 9
print(bad)  # [[9,0,0],[9,0,0],[9,0,0]]  oops!

# CORRECT: each row is a separate list
good = [[0] * 3 for _ in range(3)]
good[0][0] = 9
print(good)  # [[9,0,0],[0,0,0],[0,0,0]]

字典推导式与集合推导式

字典推导式和集合推导式使用花括号:字典使用 {k: v for ...},集合使用 {expr for ...}。两者都可以进行筛选,因此您可以用一行代码完成转换或去重。

# Dict comprehension: square lookup
sq_map = {n: n**2 for n in range(1, 6)}
print(sq_map)  # {1:1, 2:4, 3:9, 4:16, 5:25}

# Set comprehension: unique lengths
words = ['cat', 'dog', 'elephant', 'ant']
unique_lengths = {len(w) for w in words}
print(unique_lengths)  # {3, 8}  (order varies)

生成器表达式:节省内存

将推导式放入 () 中,就会得到一个每次生成一个值的生成器,从而节省内存。您可以将它直接传给 sum、max,或任何需要处理超长序列的函数。

# List comprehension builds all values at once
total = sum([n**2 for n in range(1_000_000)])

# Generator yields one at a time — lower memory
total = sum(n**2 for n in range(1_000_000))
print(total)  # 333332833333500000

# any/all with generators short-circuit early
nums = [4, 6, 8, 3, 10]
has_odd = any(n % 2 == 1 for n in nums)
print(has_odd)  # True  (stops at 3)

map() 和 filter():函数式风格

map 会对每个元素应用一个函数;filter 会保留通过条件检查的元素。两者都是惰性的,因此请将它们包装在 list() 中以查看结果。列表推导式通常更清晰。

nums = [1, 2, 3, 4, 5]

# map: apply function to each element
doubled = list(map(lambda n: n * 2, nums))
print(doubled)  # [2, 4, 6, 8, 10]

# filter: keep elements passing predicate
evens = list(filter(lambda n: n % 2 == 0, nums))
print(evens)    # [2, 4]

# Equivalent comprehensions (often preferred)
doubled = [n * 2 for n in nums]
evens   = [n for n in nums if n % 2 == 0]

zip():配对序列

zip 会将两个序列配对,并在较短的序列结束时停止,这是同时遍历两个列表的简洁方式。技巧 zip(*matrix) 可以转置二维列表。请查看代码。

keys   = ['a', 'b', 'c']
values = [1, 2, 3]

pairs = list(zip(keys, values))
print(pairs)  # [('a',1), ('b',2), ('c',3)]

# Build dict from two lists
d = dict(zip(keys, values))
print(d)      # {'a':1, 'b':2, 'c':3}

# Transpose a matrix
matrix = [[1,2,3],[4,5,6],[7,8,9]]
transposed = [list(row) for row in zip(*matrix)]
print(transposed)  # [[1,4,7],[2,5,8],[3,6,9]]

enumerate():索引加值

enumerate 会在循环时提供 (index, value),比 range(len(lst)) 更简洁,也不会出现差一位错误。请使用 start 参数从 1 开始计数。

fruits = ['apple', 'banana', 'cherry']

# Instead of: for i in range(len(fruits)):
for i, fruit in enumerate(fruits):
    print(i, fruit)
# 0 apple / 1 banana / 2 cherry

# Start from 1
for i, fruit in enumerate(fruits, 1):
    print(f'{i}. {fruit}')
# 1. apple / 2. banana / 3. cherry

使用键函数的 sorted()

sorted 会返回一个新的已排序列表,并接受用于自定义顺序的 key 函数。您可以按长度、元组字段或不区分大小写的方式排序。代码展示了多键排序。

# Sort by second element of tuple
intervals = [(1,3),(2,1),(0,5)]
print(sorted(intervals, key=lambda x: x[1]))
# [(2,1),(1,3),(0,5)]

# Sort strings case-insensitively
words = ['Banana', 'apple', 'Cherry']
print(sorted(words, key=str.lower))
# ['apple', 'Banana', 'Cherry']

# Sort by multiple keys: first by length, then alphabetically
words = ['fig', 'apple', 'ant', 'kiwi']
print(sorted(words, key=lambda w: (len(w), w)))
# ['ant', 'fig', 'kiwi', 'apple']

使用 key 的 min() 和 max()

min 和 max 同样接受 key,因此您可以通过一次调用,获取映射值最小或最大的元素,例如最长的单词。请查看代码。

words = ['banana', 'fig', 'strawberry', 'kiwi']

longest = max(words, key=len)
print(longest)   # strawberry

shortest = min(words, key=len)
print(shortest)  # fig

# Find interval with earliest end
intervals = [(2,6),(1,3),(4,5)]
earlist_end = min(intervals, key=lambda x: x[1])
print(earlist_end)  # (1, 3)

使用 any() 和 all() 进行短路检查

any 会在第一个真值元素处停止;all 会在第一个假值元素处停止。两者都会进行短路求值,因此与生成器配合使用时,可以快速且惰性地检查条件。

nums = [2, 4, 6, 7, 8]

all_even = all(n % 2 == 0 for n in nums)
print(all_even)  # False  (7 is odd)

has_large = any(n > 5 for n in nums)
print(has_large) # True  (6 qualifies, stops there)

# Practical: check if sudoku row has no duplicates
row = [1, 2, 3, 4, 5, 6, 7, 8, 9]
valid = all(1 <= n <= 9 for n in row) and len(set(row)) == 9
print(valid)  # True

sum()、abs() 和 divmod()

三个数学辅助函数随处可见:sum、abs 和 divmod。divmod(a, b) 会同时返回商和余数,非常适合提取数字。

# sum with generator
print(sum(n**2 for n in range(1, 6)))  # 55

# abs for distance problems
print(abs(-7))   # 7

# divmod for digit extraction
num = 1234
digits = []
while num:
    num, d = divmod(num, 10)
    digits.append(d)
digits.reverse()
print(digits)  # [1, 2, 3, 4]

快速测验

快速检查一下,看看您对推导式和内置函数掌握得如何。只有一个问题,您一定可以做到。✅

课程回顾

回顾一下:推导式可以将循环写成单行代码,zip 和 sorted 等内置函数接受 key 函数,而生成器可以为单遍处理节省内存。

常见问题解答

「推导式与内置函数」课时是免费的吗?

是的 — 「推导式与内置函数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DSA Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 DSA Interview Prep 课程共包含 4 节课。

「推导式与内置函数」这节课中我会学到什么?

使用列表、字典和集合推导式,以及 map、filter、zip、enumerate 和带键函数的 sorted,编写简洁的解法。 你通过在浏览器中直接运行的动手代码来练习 DSA Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 DSA Interview Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 DSA Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「推导式与内置函数」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 DSA Interview Prep 课中编写并运行代码吗?

能。每节 DSA Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 列表、元组与切片
  2. Python 中的字典与集合
  3. 推导式与内置函数
  4. 函数、闭包与 Lambda
← 返回 DSA Interview Prep