dict.get / dict.setdefault / defaultdict
问题
访问一个不存在的键会报KeyError
dic = dict()
dic['key']
Traceback (most recent call last):
File "C:\Users\Fuger\AppData\Local\Programs\Python\Python38\lib\site-packages\IPython\core\interactiveshell.py", line 3444, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-3-0b90da6672e1>", line 1, in <module>
dic['key']
KeyError: 'key'
最初我是这样解决的:
if 'key' in dic.keys():
print(dic['key'])
效率较低。根据需求可以调用如下函数:
# 只想取值
# dict.get(key, defaultValue)
dic = dict()
value = dic.get('key', 'value')
value
Out[8]: 'value'
如果是向字典中添加:
# setdefault用法同get,但当键不存在时会创建新键并设置默认值,然后再取值并返回
dic = { 'key_1': 'value_1', }
v = dic.setdefault('key_1', 'value_2')
v
Out[15]: 'value_1'
v = dic.setdefault('key_2', 'value_2')
v
Out[17]: 'value_2'
dic
Out[18]: {'key_1': 'value_1', 'key_2': 'value_2'}
场景举例:统计字符串中字符词频
dic = {}
s = 'asdsadada'
for c in s:
dic[c] = dic.setdefault(c, 0) + 1
print(dic)
{'a': 4, 's': 2, 'd': 3}
仍然不太友好。python官方库collections提供了一种数据类型:collections.defaultdict
from collections import defaultdict
# defaultdict(default_factory)
# 直接用defaultdict[key]取值时,行为类似dict.setdefault
# value是default_factory指定的类实例,其值为该类型下的默认值
dic_1 = defaultdict() # type(value) == None
# 默认value类型为None,无法设置默认值
dic_1['key']
Traceback (most recent call last):
File "C:\Users\Fuger\AppData\Local\Programs\Python\Python38\lib\site-packages\IPython\core\interactiveshell.py", line 3444, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-27-94f1191f1822>", line 1, in <module>
dic_1['key']
dic_2 = defaultdict(list)
dic_2['key'].append('value')
dic_2['key_1'] = 0
dic_2
Out[34]: defaultdict(list, {'key': ['value'], 'key_1': 0})
dic_2['key_2']
Out[35]: []
dic_3 = defaultdict(int)
dic_3['key']
Out[36]: 0
统计词频,用defaultdict
改写:
dic = defaultdict(int)
for c in s:
dic[c] += 1
除了类以外,还可以指定为函数:
from datetime import datetime
def getDate():
return datetime.now()
dic_date = defaultdict(getDate)
print(dic_date['key'])
2022-03-16 21:13:59.579308
复习
键只能是不可变数据类型,因为需要Hash。 defaultdict是dict的一个子类,可以为一个不存在的键提供默认值,避免KeyError异常,其他功能同dict。
参考博客
https://blog.csdn.net/u014248127/article/details/79338543
https://blog.csdn.net/qq_27575895/article/details/81093495