问题
怎样实现一个键对应多个值的字典(也叫 multidict
)?
例如:
d = {
'a' : [1, 2, 3],
'b' : [4, 5]
}
e = {
'a' : {1, 2, 3},
'b' : {4, 5}
}
解决方案
使用collections
模块中的defaultdict
类
defaultdict
的特点是,当key不存在时,会自动创建它,也就是说我们不用再像dict
一样首先判断key是否存在了,下面是一个例子:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d['a'].append(1)
>>> d['a'].append(2)
>>> d['a'].append(3)
>>> d['b'].append(4)
>>> d['b'].append(5)
>>> print(d)
defaultdict(<class 'list'>, {'a': [1, 2, 3], 'b': [4, 5]})
当然,也可以用dict
的setdefault
函数来实现同样的效果,但看起来会比较“丑陋”
>>> d = dict()
>>> d.setdefault('a', []).append(1)
>>> d.setdefault('a', []).append(2)
>>> print(d)
{'a': [1, 2]}
讨论
根据Python3官方文档对defaultdict的介绍可以了解到
defaultdict
是dict
的子类,defaultdict
重写了dict
的__missing__
方法,并且增加了一个可以修改的default_factory
成员
当defaultdict
的key不存在时,会将key初始化为调用default_factory
得到的返回值,default_factory
可以在初始化时指定,也可以随后再进行改变
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d['l'].append(1)
>>> d.default_factory = set
>>> d['s'].add(2)
>>> print(d)
defaultdict(<class 'set'>, {'l': [1], 's': {2}})
来源
Python Cookbook
关注
欢迎关注我的微信公众号:python每日一练
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。