python - Python defaultdict(default) vs dict.get(key, default)
问题描述
假设我想创建一个dict
(或类似dict
对象),如果我尝试访问不在dict
.
我可以通过使用来做到这一点defaultdict
:
from collections import defaultdict
foo = defaultdict(lambda: "bar")
print(foo["hello"]) # "bar"
或通过使用常规dict
并始终使用dict.get(key, default)
来检索值:
foo = dict()
print(foo.get("hello", "bar")) # "bar"
print(foo["hello"]) # KeyError (as expected)
除了必须记住使用.get()
默认值而不是预期的括号语法的明显人体工程学开销之外,这两种方法之间有什么区别?
解决方案
除了拥有每个人的人体工程学之外.get
,一个重要的区别是,如果您在其中查找缺少的键,defaultdict
则会将一个新元素插入其自身,而不仅仅是返回默认值。最重要的影响是:
- 稍后的迭代将检索在 a 中查找的所有键
defaultdict
- 随着更多最终存储在字典中,通常会使用更多内存
- 默认值的突变会将该突变存储在 a
defaultdict
中,.get
除非存储显式,否则默认值会丢失
from collections import defaultdict
default_foo = defaultdict(list)
dict_foo = dict()
for i in range(1024):
default_foo[i]
dict_foo.get(i, [])
print(len(default_foo.items())) # 1024
print(len(dict_foo.items())) # 0
# Defaults in defaultdict's can be mutated where as with .get mutations are lost
default_foo[1025].append("123")
dict_foo.get(1025, []).append("123")
print(default_foo[1025]) # ["123"]
print(dict_foo.get(1025, [])) # []
推荐阅读
- excel - 无法在 Excel 中定义对象
- kotlin - 如何在 Kotlin Multiplatform(纯 kotlin)中进行延迟
- sql - Oracle SQL CREATE TABLE 耗时太长或无法创建(没有 CREATE TABLE 工作)
- unity3d - Destroying Prefabs Object After Spawn Using collision
- r - 针对所有变量调用 R 函数
- karate - 如何将变量发送到调用空手道功能文件的文本文件......?
- javascript - 分配给电子邮件地址的颜色不适用于其他帐户
- language-lawyer - 为什么这个包含两个 volatile 写入数据的 Java 程序没有竞争?
- metal - 如何优化金属管道
- javascript - 使用对象中最新的受影响数据