在实际中使用defaultdict
会十分效率地为我们构建不同格式的数据,通常需要好几层循环构建的数据如果巧用defaultdict
的话使用一层循环便可实现,这一点笔者深有体会!本文就为大家总结一下使用defaultdict
构建数据的一些实例。
整合相同类型的数据
现有如下的数据:
1 | res = [ |
我们需要将相同HOUSE
的ID
整合到一起,然后以每个ID
为key,找到每个ID对应的详情,想要的结果如下(每个ID对应的detail信息是从其他接口获取的)
:
1 | { |
这里就不介绍其他的方法了,有兴趣的同学可以自己试试,这里直接给出defaultdict的方法:
1 | from collections import defaultdict |
可以看到最终得到一个defaultdict对象
,是一个自定义的字典
,其实它可以被强转为一个dict对象,但是强转没有意义,将得到的结果可以直接当做是一个字典对象就可以。
我们看一下默认字典的声明:
1 | from collections import defaultdict |
这样的声明之后,我们可以将ret看成一个字典对象,这个字典对象中默认的元素
是dict
(就是上面defaultdict中的参数),声明之后我们可以将ret当做是一个字典来进行操作,对ret中的元素可以进行字典的操作(defaultdict中用什么元素就可以使用对应的方法,比如上面例子用到了dict的update方法)。
其他的例子
如果上面的说明你还没有看明白的话,笔者这里列举一些常见的例子帮助大家理解。
合并字符串
下面这个例子其实是笔者之前遇到的一个面试题,在此分享一下:
有如下两个列表:
1 | a = ['a,1', 'b,3,22', 'c,3,4', 'f,5', ] |
需要将两个列表中有相同字母的字符串合并,合并后的结果如下:
1 | c = ['a,1,2', 'b,3,22,4', 'c,3,4,123', 'f,5', 'w,12', 'd,2'] |
当初年轻的我是这么做的:
1 | # -*- coding:utf-8 -*- |
其实使用defaultdict的话会很方便:
1 | # -*- coding:utf-8 -*- |
这里可以看到:defaultdict中的元素是str,因此我们在构建数据的时候可以使用字符串拼接的方式。
统计颜色数量
现有如下的数据:
1 | lis = [('红色',1),('白色',2),('绿色',3),('紫色',1),('红色',1),('白色',1),('红色',1),('粉色',1),] |
统计一下每个颜色的数量,期望的结果如下:
1 | dic = {'红色': 3, '白色': 3, '绿色': 3, '紫色': 1, '粉色': 1} |
默认元素选择list,实现方法如下:
1 | # -*- coding:utf-8 -*- |
默认元素为int,三次登陆失败锁定的简单例子
userinfo
文件中的内容如下,作为登陆的用户名密码测试文件:
1 | whw|123 |
locked
文件中存放的是被锁定的用户名。
实现一个简单的三次登陆失败锁定的例子:
1 | # -*- coding:utf-8 -*- |