欢迎关注个人公众号:爱生活爱扣钉

在 Python 编程中,处理字典缺失键是再常见不过的场景。许多开发者第一反应会使用 dict.get(),它能避免抛出 KeyError,看起来简洁又安全。然而,get() 并不是万能解法,在一些情况下甚至会带来冗余和可维护性问题。

本文将带你梳理三种方法:get()setdefault()defaultdict,并比较它们的适用场景。

dict.get() 的优势与局限

get() 的常见用法如下:

data = {"name": "Alice"}
age = data.get("age", 0)  # 默认返回 0

这种写法避免了异常,看似优雅。但问题在于默认值被埋在方法参数中,表达意图不够直观。如果默认值是函数或复杂表达式,代码会显得冗长。更重要的是,get() 不会把默认值写回字典,导致后续逻辑可能不一致。

因此,当你既想获取值,又希望初始化缺失键时,get() 就显得力不从心。

setdefault():取值与初始化

setdefault() 提供了一种更简洁的方式:

config = settings.setdefault("timeout", 30)

它的行为是:

  • 如果键存在,直接返回已有值;
  • 如果键不存在,写入默认值并返回。

相比于 get() + 手动赋值的组合,setdefault() 更直观,能减少重复逻辑。

对比示例:

# 使用 get()
config = settings.get("timeout", 30)
if "timeout" not in settings:
    settings["timeout"] = 30

# 使用 setdefault()
config = settings.setdefault("timeout", 30)

后一种写法更清晰,且保证字典完整性。

defaultdict:自动化的优雅解决方案

在需要频繁初始化默认值的场景中,defaultdict 更加高效。

它来自 collections 模块:

from collections import defaultdict

words = ["apple", "ant", "banana", "book", "cat"]
grouped = defaultdict(list)

for word in words:
    grouped[word[0]].append(word)

print(dict(grouped))
# {'a': ['apple', 'ant'], 'b': ['banana', 'book'], 'c': ['cat']}

setdefault() 相比,defaultdict 更进一步:

  • 自动为缺失键创建默认值;
  • 代码更简洁;
  • 意图更明确,尤其在处理集合或分组操作时。

它几乎是“无需思考的选择”,尤其适合需要大量初始化的场景。

DEMO

考虑一个应用配置字典:

settings = {"theme": "dark"}
timeout = settings.get("timeout", 30)

这样虽然能拿到默认值,但配置字典中依然没有 timeout,可能造成误解。

使用 setdefault()

timeout = settings.setdefault("timeout", 30)
# settings = {"theme": "dark", "timeout": 30}

如果需要处理多个默认值,则可以直接使用 defaultdict

from collections import defaultdict

settings = defaultdict(lambda: "N/A")
settings.update({"theme": "dark"})
print(settings["timeout"])  # 输出 N/A

这样,缺失键问题完全由字典本身管理,逻辑更加统一。

三种方法的比较与选择

dict.get(key, default):返回值或默认值,但不会更新字典。适合只读场景。

dict.setdefault(key, default):返回值,若不存在则写入默认值。适合需要“获取+ 初始化”的情况。

collections.defaultdict:自动初始化缺失键,特别适合处理集合与高频缺失键。

合理选择工具,可以让代码更简洁、意图更清晰,也更符合 Pythonic 风格。


写 Python 并不只是追求“能跑就行”,更重要的是可读性可维护性

  • get() 提供了安全的回退机制,但不要滥用;
  • setdefault() 能减少冗余代码,保持逻辑完整;
  • defaultdict 则为复杂场景提供了最优解。

下次写字典逻辑时,不妨先想一想:我真正需要的,是只读、初始化,还是自动化?

选择正确的方法,就是写出高质量 Python 代码的第一步。

最后修改:2025 年 09 月 12 日
本站福利|微信扫描二维码,永久享受 96 折充话费电费