Python defaultdict使用

本篇内容节选和改编自《Python 进阶》

Python除了dict外,还有个defaultdict。与dict不同的是,defaultdict不需要事先检查key是否存在。下面介绍下defaultdict的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from collections import defaultdict

colours = (
('Yasoob', 'Yellow'),
('Ali', 'Blue'),
('Arham', 'Green'),
('Ali', 'Black'),
('Yasoob', 'Red'),
('Ahmed', 'Silver')
)

favourite_colours = defaultdict(list)

for name, colour in colours:
favourite_colours[name].append(colour)

print(favourite_colours)

运行输出:

1
2
3
4
5
6
# defaultdict(<type 'list'>,
{'Arham': ['Green'],
'Yasoob': ['Yellow', 'Red'],
'Ahmed': ['Silver'],
'Ali': ['Blue', 'Black']
})

另一个重要的例子是: 当在dict里进行嵌套赋值时,如果key不存在,会触发KeyError异常,使用defaultdict可以解决这个问题。

先看一个例子:

1
2
3
4
some_dict = {}
some_dict['colours']['favourite'] = 'yellow'

# 异常输出: KeyError: 'colours'

解决方案:

1
2
3
4
5
6
7
import collections
# 这行是关键,也很抽象
tree = lambda: collections.defaultdict(tree)
some_dict = tree()
some_dict['colours']['favourite'] = 'yellow'

# 运行正常

使用 json.dumps打印some_dict:

1
2
3
4
import json
print(json.dumps(some_dict))

# 输出: {"colours": {"favourite": "yellow"}}