How does collections.defaultdict work?

前端 未结 15 2190
离开以前
离开以前 2020-11-22 12:50

I\'ve read the examples in python docs, but still can\'t figure out what this method means. Can somebody help? Here are two examples from the python docs

>         


        
15条回答
  •  青春惊慌失措
    2020-11-22 13:02

    Since the question is about "how it works", some readers may want to see more nuts and bolts. Specifically, the method in question is the __missing__(key) method. See: https://docs.python.org/2/library/collections.html#defaultdict-objects .

    More concretely, this answer shows how to make use of __missing__(key) in a practical way: https://stackoverflow.com/a/17956989/1593924

    To clarify what 'callable' means, here's an interactive session (from 2.7.6 but should work in v3 too):

    >>> x = int
    >>> x
    
    >>> y = int(5)
    >>> y
    5
    >>> z = x(5)
    >>> z
    5
    
    >>> from collections import defaultdict
    >>> dd = defaultdict(int)
    >>> dd
    defaultdict(, {})
    >>> dd = defaultdict(x)
    >>> dd
    defaultdict(, {})
    >>> dd['a']
    0
    >>> dd
    defaultdict(, {'a': 0})
    

    That was the most typical use of defaultdict (except for the pointless use of the x variable). You can do the same thing with 0 as the explicit default value, but not with a simple value:

    >>> dd2 = defaultdict(0)
    
    Traceback (most recent call last):
      File "", line 1, in 
        dd2 = defaultdict(0)
    TypeError: first argument must be callable
    

    Instead, the following works because it passes in a simple function (it creates on the fly a nameless function which takes no arguments and always returns 0):

    >>> dd2 = defaultdict(lambda: 0)
    >>> dd2
    defaultdict( at 0x02C4C130>, {})
    >>> dd2['a']
    0
    >>> dd2
    defaultdict( at 0x02C4C130>, {'a': 0})
    >>> 
    

    And with a different default value:

    >>> dd3 = defaultdict(lambda: 1)
    >>> dd3
    defaultdict( at 0x02C4C170>, {})
    >>> dd3['a']
    1
    >>> dd3
    defaultdict( at 0x02C4C170>, {'a': 1})
    >>> 
    

提交回复
热议问题