Python defaultdict(默认)与 dict.get(键,默认)
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()
和默认值而不是预期的括号语法的明显的人体工程学开销之外,这两种方法之间有什么区别?
这里的区别实际上取决于您希望程序如何处理 KeyError。
foo = dict()
def do_stuff_with_foo():
print(foo["hello"])
# Do something here
if __name__ == "__main__":
try:
foo["hello"] # The key exists and has a value
except KeyError:
# The first code snippet does this
foo["hello"] = "bar"
do_stuff_with_foo()
# The second code snippet does this
exit(-1)
这是我们要完全停止该程序的问题吗?我们是希望用户为 foo["hello"] 填写一个值还是我们想使用默认值?
第一种方法更紧凑 foo.get("hello", "bar")
但更重要的是这是我们真正想要发生的事情吗?
除了拥有 .get
每个人的人体工程学之外,一个重要的区别是,如果您在 defaultdict
中查找丢失的键,它将向自身插入一个新元素,而不是仅仅返回默认值。这其中最重要的含义是:
- 以后的迭代将检索在
defaultdict
中查找的所有键
- 随着更多的最终存储在字典中,通常会使用更多的内存
- 默认值的变更会将该变更存储在
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, [])) # []
假设我想创建一个 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()
和默认值而不是预期的括号语法的明显的人体工程学开销之外,这两种方法之间有什么区别?
这里的区别实际上取决于您希望程序如何处理 KeyError。
foo = dict()
def do_stuff_with_foo():
print(foo["hello"])
# Do something here
if __name__ == "__main__":
try:
foo["hello"] # The key exists and has a value
except KeyError:
# The first code snippet does this
foo["hello"] = "bar"
do_stuff_with_foo()
# The second code snippet does this
exit(-1)
这是我们要完全停止该程序的问题吗?我们是希望用户为 foo["hello"] 填写一个值还是我们想使用默认值?
第一种方法更紧凑 foo.get("hello", "bar")
但更重要的是这是我们真正想要发生的事情吗?
除了拥有 .get
每个人的人体工程学之外,一个重要的区别是,如果您在 defaultdict
中查找丢失的键,它将向自身插入一个新元素,而不是仅仅返回默认值。这其中最重要的含义是:
- 以后的迭代将检索在
defaultdict
中查找的所有键
- 随着更多的最终存储在字典中,通常会使用更多的内存
- 默认值的变更会将该变更存储在
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, [])) # []