dict.get / dict.setdefault / defaultdict

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值