0Pricing
DSA Interview Prep · 课时

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'))  # True

Python 集合:无序的唯一元素集合

集合存放唯一元素,成员测试的复杂度为 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 反馈 — 无需本地设置。

此课程中的所有课时

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