defaultdict
标准字典包括setdefault()方法来检索值并在值不存在时设置默认值。相比之下,defaultdict
允许调用者在容器初始化时事先指定默认值(要返回的值)。
由Doug Hellmann在The Python Standard Library by Example中定义。
如何使用defaultdict
导入defaultdict
>>> from collections import defaultdict
初始化defaultdict
通过将callable作为第一个参数(必需)传递来进行初始化
>>> d_int = defaultdict(int)
>>> d_list = defaultdict(list)
>>> def foo():
... return 'default value'
...
>>> d_foo = defaultdict(foo)
>>> d_int
defaultdict(<type 'int'>, {})
>>> d_list
defaultdict(<type 'list'>, {})
>>> d_foo
defaultdict(<function foo at 0x7f34a0a69578>, {})
**kwargs作为其第二个参数(可选)
>>> d_int = defaultdict(int, a=10, b=12, c=13)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
或者
>>> kwargs = {'a':10,'b':12,'c':13}
>>> d_int = defaultdict(int, **kwargs)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
它是如何工作的
作为标准字典的子类,它可以执行所有相同的功能。
但是,在传递未知键时,它会返回默认值而不是错误。例如:
>>> d_int['a']
10
>>> d_int['d']
0
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12, 'd': 0})
如果您想更改默认值,请覆盖default_factory:
>>> d_int.default_factory = lambda: 1
>>> d_int['e']
1
>>> d_int
defaultdict(<function <lambda> at 0x7f34a0a91578>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0})
或者
>>> def foo():
... return 2
>>> d_int.default_factory = foo
>>> d_int['f']
2
>>> d_int
defaultdict(<function foo at 0x7f34a0a0a140>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0, 'f': 2})
问题中的例子
例子1
由于int被作为default_factory传递,任何未知的键默认返回0。
现在,在循环中传递字符串,它将增加d中这些字母的计数。
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> d.default_factory
<type 'int'>
>>> for k in s:
... d[k] += 1
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
>>> d
defaultdict(<type 'int'>, )
作为默认工厂传递了一个列表,因此任何未知(不存在的)键都将默认返回 [ ](即列表)。
现在,由于元组列表在循环中传递,它将在 d[color] 中追加值。
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> d.default_factory
<type 'list'>
>>> for k, v in s:
... d[k].append(v)
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
>>> d
defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})
default_factory = None
。参考这个问题。 - Asclepius