python 中如果访问字典中不存在的键,会引发 KeyError 异常。defaultdict 完全可以当成字典来使用,但是它可以提供一个 default_factory 属性,该属性所指定的函数负责为不存在的 key 来生成 value。具体如下代码所示:
from collections import defaultdict
my_dict = {}
# 使用int作为defaultdict的default_factory
# 当key不存在时,将会返回int()函数的返回值
my_defaultdict = defaultdict(int)
print(my_defaultdict['a']) # 0
print(my_dict['a']) # KeyError
输出结果:
0
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-275-66c0f7dee2f4> in <module>()
5 my_defaultdict = defaultdict(int)
6 print(my_defaultdict['a']) # 0
----> 7 print(my_dict['a']) # KeyError
KeyError: 'a'
defaultdict 实现一键多值的意思:我个人认为就是可以动态为对应键添加 value
"""
先定义一个字典,然后把defaultdict(list)赋值给字典,字典会被覆盖
"""
from collections import defaultdict
d={'a':[1,2,3],'b':[4,5]}
print(d)
{'a': [1, 2, 3], 'b': [4, 5]}
d=defaultdict(list)
print(d)
defaultdict(<class 'list'>, {})
"""
先定义defaultdict(list),然后再把字典赋值,defaultdict也会被覆盖
"""
from collections import defaultdict
d=defaultdict(list)
d={'a':[1,2,3],'b':[4,5]}
print(d)
{'a': [1, 2, 3], 'b': [4, 5]}
print(d['a'])
print(d)
print(d['c'])
[1, 2, 3]
{'a': [1, 2, 3], 'b': [4, 5]}
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-334-d7deff4162bb> in <module>()
1 print(d['a'])
2 print(d)
----> 3 print(d['c'])
KeyError: 'c'
"""
实现动态添加键值功能
"""
from collections import defaultdict
d=defaultdict(list)
print(d)
defaultdict(<class 'list'>, {})
"""
第一次运行以下代码块
"""
d['a'].append("python")
print(d)
print(d['a'])
print(d['c'])
输出结果:
defaultdict(<class 'list'>, {'a': ['python']})
['python']
[]
"""
第二次运行以上代码块
"""
输出结果:
defaultdict(<class 'list'>, {'a': ['python', 'python'], 'c': []})
['python', 'python']
[]
"""
第三次运行该代码块,并为c赋值
"""
d['a'].append("python")
d['c'].append("java")
print(d)
print(d['a'])
print(d['c'])
输出结果:
defaultdict(<class 'list'>, {'a': ['python', 'python', 'python'], 'c': ['java']})
['python', 'python', 'python']
['java']
从以上代码可知:defaultdict 比直接定义的字典好用,当不知道当前字典是否有具体的某个键时,在查询键值时,不会发生错误。而且还可以为某个键动态赋值。
领取专属 10元无门槛券
私享最新 技术干货