【问题标题】:Understanding the use of defaultdict in Python [duplicate]了解 Python 中 defaultdict 的使用 [重复]
【发布时间】:2017-05-18 05:27:19
【问题描述】:

我开始学习 Python,并且遇到了一段代码,希望你们中的某个人能帮助我理解。

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

结果:

{ "Joel" : { "City" : Seattle"}}

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

【问题讨论】:

  • A defaultdict 是一个 dict,如果尚未设置键,则其键“默认”为值。你基本上有一本字典(第三行)。

标签: python


【解决方案1】:

来自documentation of defaultdict

如果 default_factory 不为 None,则在不带参数的情况下调用它以为给定键提供默认值,该值被插入到键的字典中,并返回。

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

【讨论】:

    【解决方案2】:

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

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

    如果您不使用默认字典,第二行会引发关键错误。因此,默认字典是通过初始化数据结构的默认值来避免此类错误的一种方式。

    【讨论】:

      【解决方案3】:

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

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

      在您的情况下,当您调用 dd_dict["Joel"] 时,dd_dict 中没有这样的键,这会引发 KeyError 异常。 defaultdict__missing__(key)协议来处理这个错误,当它找不到key时,它会调用default_factory不带参数为给定的key提供一个默认值。

      所以当您调用dd_dict["Joel"] 时,这会给您一个字典{},然后您将项目["City"] = "Seattle" 添加到空字典中,类似于:

      {}["City"] = "Seattle"
      

      【讨论】:

        【解决方案4】:

        当一个键被访问并且丢失时,__missing__ 方法被访问。

        对于普通的dict,引发KeyError

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

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

        例子:

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

        【讨论】:

          【解决方案5】:

          当您访问未退出的 defaultdict 的键时,您将获得您提供的函数返回的内容。

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

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

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

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

          【讨论】:

            【解决方案6】:

            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 中创建了一个键值对 ("Joel", {}),然后在空字典上设置了 ("City", "Seattle") 键值对。

            相当于:

            >>> 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'}})
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-11-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-06-20
              相关资源
              最近更新 更多