python : defaultdict

本文介绍了Python中defaultdict的应用,包括如何避免KeyError并简化字典操作。通过递归定义树形结构,展示了defaultdict的灵活性与便利性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.sina.com.cn/s/blog_45ac0d0a01019010.html
初次见到defaultdict是在一篇《一行Python代码定义树》的文章中。
文章中定义的结构:
def tree():
return defaultdict(tree)
这里应用了递归定义。help(defaultdict)可以发看到他是一个类,并且提供的方法类似dict类,通过文档了解到他是一个带工场方法或工厂类的字典。当所访问的键不存在时,会调用工厂方法或工厂类生成默认值。
这个定义生成的是一个defaultdict嵌套结构,可以看做一个dict嵌套结构,因为defaultdict可以看成带默认值的dict。这个结构的好处是,永远不会出现键不存在的错误(KeyError),因为键不存在的时候会调用工场函数tree,生成对应的值,这里生成的值仍是一个defaultdict对象,所以无论深度多大,都不会出现KeyError。
文章中的测试数据:
users = tree()
users[‘harold’][‘username’] = ‘hrldcpr’
users[‘handler’][‘username’] = ‘matthandlersux’
users对应的dict为:
{“harold”: {“username”: “hrldcpr”}, “handler”: {“username”: “matthandlersux”}}
通过观察发现defaultdict类提供了iter方法,所以defaultdict类对象是一个可迭代对象,迭代方式和dict类似,对键进行迭代。
这个类在创建某些需要默认值的字典时实用,比如官方文档上给出的例子:

s = [(‘yellow’, 1), (‘blue’, 2), (‘yellow’, 3), (‘blue’, 4), (‘red’, 1)]
d = defaultdict(list) >>> for k, v in s: … d[k].append(v) …
d.items() [(‘blue’, [2, 4]), (‘red’, [1]), (‘yellow’, [1, 3])]
如果改用dict的,每次执行d[k].append(v)时要用has_key()方法判断键是否存在,不存在时设置对应的值为[]。
初次见到defaultdict是在一篇《一行Python代码定义树》的文章中。
文章中定义的结构:
def tree():
return defaultdict(tree)
这里应用了递归定义。help(defaultdict)可以发看到他是一个类,并且提供的方法类似dict类,通过文档了解到他是一个带工场方法或工厂类的字典。当所访问的键不存在时,会调用工厂方法或工厂类生成默认值。
这个定义生成的是一个defaultdict嵌套结构,可以看做一个dict嵌套结构,因为defaultdict可以看成带默认值的dict。这个结构的好处是,永远不会出现键不存在的错误(KeyError),因为键不存在的时候会调用工场函数tree,生成对应的值,这里生成的值仍是一个defaultdict对象,所以无论深度多大,都不会出现KeyError。
文章中的测试数据:
users = tree()
users[‘harold’][‘username’] = ‘hrldcpr’
users[‘handler’][‘username’] = ‘matthandlersux’
users对应的dict为:
{“harold”: {“username”: “hrldcpr”}, “handler”: {“username”: “matthandlersux”}}
通过观察发现defaultdict类提供了iter方法,所以defaultdict类对象是一个可迭代对象,迭代方式和dict类似,对键进行迭代。
这个类在创建某些需要默认值的字典时实用,比如官方文档上给出的例子:
s = [(‘yellow’, 1), (‘blue’, 2), (‘yellow’, 3), (‘blue’, 4), (‘red’, 1)]
d = defaultdict(list) >>> for k, v in s: … d[k].append(v) …
d.items() [(‘blue’, [2, 4]), (‘red’, [1]), (‘yellow’, [1, 3])]
如果改用dict的,每次执行d[k].append(v)时要用has_key()方法判断键是否存在,不存在时设置对应的值为[]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值