Python 中的字典与集合
探索字典和集合的构造、成员测试,以及使用 collections.Counter 统计频率等常见模式。
Python 中的字典与集合 是 CoddyKit 上的免费 DSA Interview Prep 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DSA Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DSA Interview Prep 课程共包含 4 节课。
Python 字典:键值存储
Python 的字典将键映射到值,查找、插入和删除的平均复杂度都是 O(1)。它是两数之和、异位词检查和频率统计等问题的基础。代码展示了具体用法。
d = {'apple': 3, 'banana': 5}
print(d['apple']) # 3
d['cherry'] = 7
print(len(d)) # 3
print('banana' in d) # True
del d['apple']
print(d) # {'banana': 5, 'cherry': 7}使用 .get() 安全查找
使用 d[key] 读取不存在的键会因 KeyError 而崩溃。请使用 d.get(key, default) 返回备用值,这是一个可以避免意外运行时错误的安全习惯。
freq = {}
words = ['the', 'cat', 'sat', 'on', 'the', 'mat']
for w in words:
freq[w] = freq.get(w, 0) + 1
print(freq)
# {'the': 2, 'cat': 1, 'sat': 1, 'on': 1, 'mat': 1}
print(freq.get('dog', 0)) # 0 (no KeyError)使用 defaultdict 简化分组
defaultdict(list) 会为每个新键自动创建空列表,因此分组问题不再需要样板代码。defaultdict(int) 会让每个键从 0 开始,便于计数。
from collections import defaultdict
groups = defaultdict(list)
words = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat']
for w in words:
key = ''.join(sorted(w)) # canonical anagram key
groups[key].append(w)
print(list(groups.values()))
# [['eat','tea','ate'], ['tan','nat'], ['bat']]Counter:快速构建频率映射
Counter 是专门用于计数的字典:向它传入任意可迭代对象,就能立即得到频率映射。most_common(k) 会返回排名前 k 的项。代码展示了异位词检查。
from collections import Counter
c = Counter('abracadabra')
print(c) # Counter({'a':5,'b':2,'r':2,'c':1,'d':1})
print(c.most_common(2)) # [('a', 5), ('b', 2)]
# Valid anagram check
def is_anagram(s, t):
return Counter(s) == Counter(t)
print(is_anagram('anagram', 'nagaram')) # TruePython 集合:无序的唯一元素集合
集合存放唯一元素,成员测试的复杂度为 O(1)。您可以使用 {1, 2, 3} 或 set(iterable),但 {} 创建的是字典,因此空集合要使用 set()。集合非常适合发现重复项。
seen = set()
nums = [1, 2, 3, 2, 1, 4]
duplicates = []
for n in nums:
if n in seen: # O(1) check
duplicates.append(n)
seen.add(n)
print(duplicates) # [2, 1]
print(len(seen)) # 4 (unique values)面试中的集合运算
集合可以进行数学运算:| 表示并集,& 表示交集,- 表示差集,^ 表示对称差集。这些运算可以用一行代码解决“公共元素”类问题。
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b) # {1, 2, 3, 4, 5, 6} union
print(a & b) # {3, 4} intersection
print(a - b) # {1, 2} difference
print(a ^ b) # {1, 2, 5, 6} symmetric diff成员测试:列表与集合
您选择的数据结构会影响速度。在列表上使用 in 进行检查的复杂度是 O(n),在集合上则是 O(1)。如果需要反复查找,先将列表转换为集合是一种常见的提速方法。
word_list = ['apple', 'banana', 'cherry', 'date']
word_set = set(word_list)
# O(n) per check
print('banana' in word_list) # True
# O(1) per check
print('banana' in word_set) # True
# Practical example: find common elements
a = [1, 2, 3, 4, 5]
b = [3, 4, 5, 6, 7]
common = [x for x in a if x in set(b)]
print(common) # [3, 4, 5]遍历字典:键、值和键值对
可以使用 .keys()、.values() 或 .items() 遍历字典。循环中绝不要删除键;请先将要删除的键收集到列表中,然后在循环结束后再删除。请查看代码。
scores = {'Alice': 90, 'Bob': 75, 'Carol': 88}
for name, score in scores.items():
print(f'{name}: {score}')
# Find key with max value
best = max(scores, key=scores.get)
print(best) # Alice
# Safe deletion
to_del = [k for k, v in scores.items() if v < 80]
for k in to_del:
del scores[k]
print(scores) # {'Alice': 90, 'Carol': 88}frozenset:可哈希的集合
frozenset 是不可变集合,因此可以作为字典键,也可以存放在另一个集合中。当顺序不重要时,它很适合根据字母集合对异位词进行分组。
from collections import defaultdict
words = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat']
groups = defaultdict(list)
for w in words:
key = frozenset(w) # hashable; 'eat','tea','ate' all share same key
groups[key].append(w)
print([sorted(g) for g in groups.values()])
# [['ate','eat','tea'], ['nat','tan'], ['bat']]使用字典推导式进行转换
字典推导式可以用一行代码构建映射:{k: v for ...}。它非常适合反转字典或筛选键值对。请注意:反转字典要求 values 具有唯一性。请查看代码。
# Invert a dict
original = {'a': 1, 'b': 2, 'c': 3}
inverted = {v: k for k, v in original.items()}
print(inverted) # {1:'a', 2:'b', 3:'c'}
# Filter by value
scores = {'Alice': 90, 'Bob': 55, 'Carol': 78}
passing = {k: v for k, v in scores.items() if v >= 60}
print(passing) # {'Alice': 90, 'Carol': 78}最长连续序列
集合可以在 O(n) 的复杂度内解决最长连续序列问题:将所有数字放入集合,然后只从前一个数字不存在的数字开始向上计数。无需排序。
def longest_consecutive(nums):
num_set = set(nums)
best = 0
for n in num_set:
if n - 1 not in num_set: # start of sequence
cur = n
streak = 1
while cur + 1 in num_set:
cur += 1
streak += 1
best = max(best, streak)
return best
print(longest_consecutive([100,4,200,1,3,2])) # 4 (1,2,3,4)快速测验
快速检查一下,看看本课中的字典和集合概念掌握得如何。请相信自己的直觉。🎯
课程回顾
回顾一下:字典可以为计数和分组提供 O(1) 查找,Counter 和 defaultdict可以减少样板代码,而集合可以将 O(n) 扫描变成 O(1) 检查。
常见问题解答
「Python 中的字典与集合」课时是免费的吗?
是的 — 「Python 中的字典与集合」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DSA Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 DSA Interview Prep 课程共包含 4 节课。
「Python 中的字典与集合」这节课中我会学到什么?
探索字典和集合的构造、成员测试,以及使用 collections.Counter 统计频率等常见模式。 你通过在浏览器中直接运行的动手代码来练习 DSA Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 DSA Interview Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 DSA Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「Python 中的字典与集合」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 DSA Interview Prep 课中编写并运行代码吗?
能。每节 DSA Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 列表、元组与切片
- Python 中的字典与集合
- 推导式与内置函数
- 函数、闭包与 Lambda