欢迎来到Louis的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
扩大
缩小

python标准库——collections模块 的defaultdict类

defaultdict类

在我们日常使用字典时,有时需要对字典的value赋予一个默认值,dict提供了一个setdefault方法可以实现,在python标准库中collections,也提供了一个defaultdict的类也实现了给字典赋予默认值的功能,而且在性能上比setdefault要快,我们直接看例子。

定义:在取defaultdict对象中不存在的key的值时,会给该key赋予一个default_factory返回值的默认值,并将该key和deault_factory返回值插入到defaultdict对象,deault_factory必须为一个工厂函数。

example1:

 1 def dicdf():
 2     return(123)
 3 dd2 = defaultdict(dicdf)
 4 for i in 'abcdefjhijklmn':
 5     dd2[i]
 6 print(dd2)
 7 
 8 dd3 = defaultdict(list)
 9 for i in 'abcdefjhijklmn':
10     dd3[i]
11 print(dd3)

输出

defaultdict(<function dicdf at 0x00000000027BE730>, {'a': 123, 'b': 123, 'c': 123, 'd': 123, 'e': 123, 'f': 123, 'j': 123, 'h': 123, 'i': 123, 'k': 123, 'l': 123, 'm': 123, 'n': 123})
defaultdict(<class 'list'>, {'a': [], 'b': [], 'c': [], 'd': [], 'e': [], 'f': [], 'j': [], 'h': [], 'i': [], 'k': [], 'l': [], 'm': [], 'n': []})

example2:

from collections import defaultdict

#dict

d = {}

for i in range(0,10):
    if i < 5:
        if 'k1' in d.keys():
            d['k1'].append(i)
        else:
            d['k1'] = [i]
    else:
        if 'k2' in d.keys():
            d['k2'].append(i)
        else:
            d['k2'] = [i]
print(d)

#setdefault
d = {}
d.setdefault('k1',[])
d.setdefault('k2',[])

for i in range(0,10):
    if i < 5:
        d['k1'].append(i)
    else:
        d['k2'].append(i)

print(d)

#defaultdict

d1 = defaultdict(list)
for i in range(0,10):
    if i < 5:
        d1['k1'].append(i)
    else:
        d1['k2'].append(i)
print(d1)

上面是根据列表中元素的大小,分别添加到字典k1,k2的列表中。

第一种方法:

需要判断key是否存在,key的第一个值需要指定为list类型。

第二种方法:

给已知key添加的默认类型,但每个key都要添加一次。

第三种方法:给未知的key的value都添加为list,这种方法最快,在需要给所有key的value赋予默认值时,最快捷。

目前defaultdict主要用于给value默认值添加数据类型,需要注意的是,defaultdict的参数需要是一个default_factory,也就是我们所说的工厂函数。

 

posted on 2017-12-26 16:05  Louiszj  阅读(428)  评论(0编辑  收藏  举报

导航