首页 > 解决方案 > 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()默认值而不是预期的括号语法的明显人体工程学开销之外,这两种方法之间有什么区别?

标签: pythonpython-collections

解决方案


除了拥有每个人的人体工程学之外.get,一个重要的区别是,如果您在其中查找缺少的键,defaultdict则会将一个新元素插入其自身,而不仅仅是返回默认值。最重要的影响是:

  • 稍后的迭代将检索在 a 中查找的所有键defaultdict
  • 随着更多最终存储在字典中,通常会使用更多内存
  • 默认值的突变会将该突变存储在 adefaultdict中,.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, [])) # []

推荐阅读