怎样使用Python字典这种数据类型呢?
Well, 知道创建字典、给元素赋值、对元素取值、删除元素、遍历元素,就OK啦!能走遍天下了!那了解什么高级特性干嘛?
让你更牛X啊!人家10分钟写完的东西你10秒就能交货啊!还不够你牛X啊!
先从可以大幅提高生产效率的collections.defaultdict
函数说起
首先看看defaultdict
的文档介绍:
1 |
|
用人类语言解释为:
- 这个
collections.defaultdict
是我们常用的dict
的子类。 - 它跟
dict
的区别在于当你访问defaultdict
实例对象中某个不存在的元素时,它不会跟dict
实例对象一样给你抛出KeyError
异常,而是在defaultdict
实例对象中添加此元素,并给他赋个默认值。 defaultdict
其他属性、方法的应用跟Python
内置的dict
一毛一样。
换个角度总结:
defaultdict
可以让你创建一个无限大的,其中包含无限个可能的元素的字典,而且其中每个元素都有一个由你指定的统一默认值。 并且因为它类似生成器思想的lazy模式使得代价及其之小。
Amazing!!!
使用方法
defaultdict
实例对象:
实例化defaultdict
的时候有两个可选参数。
- 第一个是
defaultdict.default_factory
,它是任何可以被以无参形式调用的函数或Python内置数据类型; - 第二个是实例对象的初始元素,数据类型为
dict
或者defaultdict
。
第一个传参:default_factory
我们可以指定default_factory
为一个内置数据类型:
1 |
|
参数default_factory
也可以是我们自定义的可调用的无参函数:
1 |
|
第二个传参
第二个参数是实例对象的初始元素,数据类型可以是dict
或者defaultdict
类型。
1 |
|
应用场景
听起来很美好,但什么情况下会用到呢?
举个例子-博客计数器:
如果你的博客页面上有个计数器,他记录每个IP地址的访问次数。
那么一种记录的数据结构就类似于:
1 |
|
我们没有办法预估有那些IP地址会访问我们的博客,从而事先创建好IP齐全的counter
先看看传统方式如何解决
1 |
|
很麻烦,而且每次都要遍历,性能也足够低下。
使用dict.setdefault
除了defaultdict
,还可以使用dict.setdefault
来达到相同的目的。
1 |
|
简化了许多,可还是不够优雅。
使用defaultdict
1 |
|
你看,高下立判。