zoukankan      html  css  js  c++  java
  • Python collections.defaultdict() 与 dict的使用和区别

    看样子这个文档是难以看懂了。直接看示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import collections
    = [('yellow'1), ('blue'2), ('yellow'3), ('blue'4), ('red'1)]
    # defaultdict
    = collections.defaultdict(list)
    for k, v in s:
        d[k].append(v)
    # Use dict and setdefault   
    = {}
    for k, v in s:
        g.setdefault(k, []).append(v)
          
    # Use dict
    = {}
    for k, v in s:
        e[k] = v
    ##list(d.items())
    ##list(g.items())
    ##list(e.items())

    看看结果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    list(d.items())
    [('blue', [24]), ('red', [1]), ('yellow', [13])]
    >>> list(g.items())
    [('blue', [24]), ('red', [1]), ('yellow', [13])]
    >>> list(e.items())
    [('blue'4), ('red'1), ('yellow'3)]
    >>> d
    defaultdict(<class 'list'>, {'blue': [24], 'red': [1], 'yellow': [13]})
    >>> g
    {'blue': [24], 'red': [1], 'yellow': [13]}
    >>> e
    {'blue'4'red'1'yellow'3}
    >>> d.items()
    dict_items([('blue', [24]), ('red', [1]), ('yellow', [13])])
    >>> d["blue"]
    [24]
    >>> d.keys()
    dict_keys(['blue''red''yellow'])
    >>> d.default_factory
    <class 'list'>
    >>> d.values()
    dict_values([[24], [1], [13]])

    可以看出

    collections.defaultdict(list)使用起来效果和运用dict.setdefault()比较相似

    python help上也这么说了

    When each key is encountered for the first time, it is not already in the mapping; so an entry is automatically created using the default_factory function which returns an empty list. The list.append() operation then attaches the value to the new list. When keys are encountered again, the look-up proceeds normally (returning the list for that key) and the list.append() operation adds another value to the list. This technique is simpler and faster than an equivalent technique using dict.setdefault():

    说这种方法会和dict.setdefault()等价,但是要更快。

    有必要看看dict.setdefault()

    setdefault(key[, default])

    If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.

    如果这个key已经在dictionary里面存着,返回value.如果key不存在,插入key和一个default value,返回Default. 默认的defaults是None.

    但是这里要注意的是defaultdict是和dict.setdefault等价,和下面那个直接赋值是有区别的。从结果里面就可以看到,直接赋值会覆盖。

    从最后的d.values还有d[“blue”]来看,后面的使用其实是和dict的用法一样的,唯一不同的就是初始化的问题。defaultdict可以利用工厂函数,给初始keyi带来一个默认值。

    这个默认值也许是空的list[]  defaultdict(list), 也许是0, defaultdict(int).

    再看看下面的这个例子。

    defaultdict(int) 这里的d其实是生成了一个默认为0的带key的数据字典。你可以想象成 d[key] = int default (int工厂函数的默认值为0)

    d[k]所以可以直接读取 d[“m”] += 1 就是d[“m”] 就是默认值 0+1 = 1

    后面的道理就一样了。

    1
    2
    3
    4
    5
    6
    7
    >>> s = 'mississippi'
    >>> d = defaultdict(int)
    >>> for in s:
    ...     d[k] += 1
    ...
    >>> list(d.items())
    [('i'4), ('p'2), ('s'4), ('m'1)]
  • 相关阅读:
    LeetCode 623. Add One Row to Tree
    LeetCode 894. All Possible Full Binary Trees
    LeetCode 988. Smallest String Starting From Leaf
    LeetCode 979. Distribute Coins in Binary Tree
    LeetCode 814. Binary Tree Pruning
    LeetCode 951. Flip Equivalent Binary Trees
    LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
    LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
    LeetCode 687. Longest Univalue Path
    LeetCode 428. Serialize and Deserialize N-ary Tree
  • 原文地址:https://www.cnblogs.com/skying555/p/5222697.html
Copyright © 2011-2022 走看看