了解在Python中使用defaultdict

时间:2017-01-04 01:56:26

标签: python

我开始学习Python,并且遇到了一段代码,我希望你们中的一位可以帮助我理解。

AVAudioSession

结果:

from collections import defaultdict
dd_dict = defaultdict(dict)
dd_dict["Joel"]["City"] = "Seattle"

我遇到问题的部分是第三行。有人可以向我解释这里发生了什么吗?

6 个答案:

答案 0 :(得分:3)

来自documentation of defaultdict

  

如果default_factory不是None,则不带参数调用它以提供给定键的默认值,该值将插入键的字典中并返回。

由于"Joel"不存在作为键,dd_dict["Joel"]部分会创建一个空字典作为键"Joel"的值。以下部分["City"] = "Seattle"就像添加一个普通的键值对一个字典 - 在本例中是dd_dict["Joel"]字典。

答案 1 :(得分:2)

第三行在字典中插入字典。通过在默认dict中使用dict作为默认值,您将告诉python使用空dict初始化每个新的dd_dict值。上面的代码相当于

dd_dict["Joel"] = {}
dd_dict['Joel"]["City"] = "Seattle"

如果你没有使用默认dict,第二行会引发一个关键错误。因此,默认dicts是一种通过初始化数据结构的默认值来避免此类错误的方法。

答案 2 :(得分:1)

  

第一个参数提供default_factory的初始值   属性;它默认为None。如果default_factory不是None,则为   不带参数调用以提供给定键的默认值,   此值将插入到键的字典中,并返回。

dd_dict = defaultdict(dict)
dd_dict["Joel"]["City"] = "Seattle"

在您的情况下,当您致电dd_dict["Joel"]时,dd_dict中没有此类密钥,这会引发KeyError异常。 defaultdict具有__missing__(key)协议来处理此错误,当它找不到密钥时,它会调用default_factory而不带参数来为给定密钥提供默认值。

所以当你拨打dd_dict["Joel"]时,这会给你一个字典{},然后你将项目["City"] = "Seattle"添加到空字典中,有点像:

{}["City"] = "Seattle"

答案 3 :(得分:0)

当访问密钥并丢失密钥时,将访问__missing__方法。

对于常规dict,会引发KeyError

对于defaultdict,您创建并访问作为参数传递的对象。

如果您创建了defaultdict(list),并尝试访问丢失的密钥,则会返回一个列表。

示例:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d['missing']
[]

答案 4 :(得分:0)

当您访问未退出的defaultdict的密钥时,您将获得所提供的功能返回的内容。

在您的情况下,您提供了dict,因此您获得了一个新的空字典:

>>> dict()
{}

>>> from collections import defaultdict
... dd_dict = defaultdict(dict)
...
>>> dd_dict['Joel']
{}

现在,您将键值对添加到此词典中:

>>> dd_dict["Joel"]["City"] = "Seattle"
"Joel" : { "City" : Seattle"}}

答案 5 :(得分:0)

defaultdict(dict)返回一个字典对象,如果用一个尚未存在的键索引它,它将返回一个空字典值:

>>> from collections import defaultdict
>>> dd_dict = defaultdict(dict)
>>> dd_dict
defaultdict(<class 'dict'>, {})
>>> dd_dict["Joel"]
{}
>>> dd_dict["anything"]
{}
>>> dd_dict[99]
{}

所以第三行在dd_dict中创建一个键值对(&#34; Joel&#34;,{}),然后设置(&#34; City&#34;,&#34; Seattle&#34; )空字典上的键值对。

它相当于:

>>> dd_dict = defaultdict(dict)
>>> dd_dict["Joel"] = {}
>>> dd_dict
defaultdict(<class 'dict'>, {'Joel': {}})
>>> dd_dict["Joel"]["City"] = "Seattle"
>>> dd_dict
defaultdict(<class 'dict'>, {'Joel': {'City': 'Seattle'}})