Python Academy · 课时

defaultdict

自动初始化字典值

第 2 / 4 课13 个步骤

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

缺少键的问题

对于普通 dict,访问不存在的键会引发 KeyError。当您想逐步累积值时,这会很麻烦。

d = {}
try:
    d['x'].append(1)
except KeyError as e:
    print('KeyError:', e)

使用默认字典

collections 中的 defaultdict 接受一个工厂函数,为任何缺少的键生成默认值。请使用 from collections import defaultdict 导入它。

from collections import defaultdict
d = defaultdict(int)
print(d['missing'])
print(dict(d))

使用 int 进行计数

使用 defaultdict(int) 时,缺少的键默认值为 0,因此您无需先检查就可以递增计数。

from collections import defaultdict
counts = defaultdict(int)
for ch in 'banana':
    counts[ch] += 1
print(dict(counts))

使用 list 进行分组

defaultdict(list) 会为新键创建空列表,非常适合将项目分组到各个桶中。

from collections import defaultdict
groups = defaultdict(list)
words = ['apple', 'ant', 'bee', 'bear']
for w in words:
    groups[w[0]].append(w)
print(dict(groups))

使用 set 收集项目

当您希望每个键对应唯一值时,请使用 defaultdict(set)。重复值会被自动删除。

from collections import defaultdict
seen = defaultdict(set)
pairs = [('a', 1), ('a', 1), ('a', 2), ('b', 3)]
for k, v in pairs:
    seen[k].add(v)
print(dict(seen))

工厂必须是可调用对象

该参数是一个无需参数即可调用并返回默认值的对象。int、list、set 和 dict 都可以使用,因为调用它们会返回空值。

from collections import defaultdict
print(int())
print(list())
print(set())

使用 lambda 设置自定义默认值

您可以提供任何不带参数的可调用对象,例如 lambda,以返回自定义默认值。

from collections import defaultdict
scores = defaultdict(lambda: 100)
print(scores['new_player'])
scores['alice'] -= 10
print(dict(scores))

嵌套默认字典

工厂本身可以创建一个 defaultdict,让您无需手动设置就能构建嵌套结构。

from collections import defaultdict
table = defaultdict(lambda: defaultdict(int))
table['fruit']['apples'] += 3
table['fruit']['pears'] += 2
print(table['fruit']['apples'])
print(table['fruit']['pears'])

访问会创建键

请注意:仅仅读取缺少的键,就会使用默认值插入该键。访问之后,该键便存在于字典中。

from collections import defaultdict
d = defaultdict(int)
_ = d['ghost']
print('ghost' in d)
print(dict(d))

检查键而不插入

若要检查键而不创建它,请使用 .get() 方法或 in 运算符,它们都不会触发工厂。

from collections import defaultdict
d = defaultdict(int)
print(d.get('safe', 'default'))
print('safe' in d)
print(dict(d))

转换回字典

如果您想得到普通字典,请将 defaultdict 包装在 dict() 中,例如在从函数返回它或整洁地打印它之前。

from collections import defaultdict
dd = defaultdict(list)
dd['a'].append(1)
plain = dict(dd)
print(type(plain))
print(plain)

快速检查

传给 defaultdict 的参数表示什么?

回顾:默认字典

要点:

  • defaultdict(factory) 会自动为缺少的键创建值。
  • int 提供 0(用于计数),list 提供 [](用于分组),set 提供空集合(用于唯一值分组)。
  • 工厂可以是任何不带参数的可调用对象,包括 lambda。
  • 读取缺少的键会插入该键;请使用 .get() 或 in 安全地查看键。
from collections import defaultdict
g = defaultdict(list)
for w in ['cat', 'cow', 'dog']:
    g[w[0]].append(w)
print(dict(g))
免费开始

用 AI 导师学习 Python — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
76
课程
320

常见问题解答

「defaultdict」课时是免费的吗?

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

「defaultdict」这节课中我会学到什么?

自动初始化字典值 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Python Academy 需要有经验吗?

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

「defaultdict」课时需要多长时间?

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

我能在这节 Python Academy 课中编写并运行代码吗?

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

此课程中的所有课时

  1. Counter
  2. defaultdict
  3. deque
  4. namedtuple 与 OrderedDict
← 返回 Python Academy