Python collections.defaultdict() 与 dict的使用和区别

看样子这个文档是难以看懂了。直接看示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import  collections
=  [( 'yellow' 1 ), ( 'blue' 2 ), ( 'yellow' 3 ), ( 'blue' 4 ), ( 'red' 1 )]
# defaultdict
=  collections.defaultdict( list )
for  k, v  in  s:
     d[k].append(v)
# Use dict and setdefault   
=  {}
for  k, v  in  s:
     g.setdefault(k, []).append(v)
      
# Use dict
=  {}
for  k, v  in  s:
     e[k]  =  v
##list(d.items())
##list(g.items())
##list(e.items())

 

看看结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
list (d.items())
[( 'blue' , [ 2 4 ]), ( 'red' , [ 1 ]), ( 'yellow' , [ 1 3 ])]
>>>  list (g.items())
[( 'blue' , [ 2 4 ]), ( 'red' , [ 1 ]), ( 'yellow' , [ 1 3 ])]
>>>  list (e.items())
[( 'blue' 4 ), ( 'red' 1 ), ( 'yellow' 3 )]
>>> d
defaultdict(< class  'list' >, { 'blue' : [ 2 4 ],  'red' : [ 1 ],  'yellow' : [ 1 3 ]})
>>> g
{ 'blue' : [ 2 4 ],  'red' : [ 1 ],  'yellow' : [ 1 3 ]}
>>> e
{ 'blue' 4 'red' 1 'yellow' 3 }
>>> d.items()
dict_items([( 'blue' , [ 2 4 ]), ( 'red' , [ 1 ]), ( 'yellow' , [ 1 3 ])])
>>> d[ "blue" ]
[ 2 4 ]
>>> d.keys()
dict_keys([ 'blue' 'red' 'yellow' ])
>>> d.default_factory
< class  'list' >
>>> d.values()
dict_values([[ 2 4 ], [ 1 ], [ 1 3 ]])

 

可以看出

collections.defaultdict(list)使用起来效果和运用dict.setdefault()比较相似

python help上也这么说了

When each key is encountered for the first time, it is not already in the mapping; so an entry is automatically created using the default_factory function which returns an empty list. The list.append() operation then attaches the value to the new list. When keys are encountered again, the look-up proceeds normally (returning the list for that key) and the list.append() operation adds another value to the list. This technique is simpler and faster than an equivalent technique using dict.setdefault():

 

说这种方法会和dict.setdefault()等价,但是要更快。

有必要看看dict.setdefault()

setdefault(key[, default])

If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.

如果这个key已经在dictionary里面存着,返回value.如果key不存在,插入key和一个default value,返回Default. 默认的defaults是None.

 

但是这里要注意的是defaultdict是和dict.setdefault等价,和下面那个直接赋值是有区别的。从结果里面就可以看到,直接赋值会覆盖。

 

从最后的d.values还有d[“blue”]来看,后面的使用其实是和dict的用法一样的,唯一不同的就是初始化的问题。defaultdict可以利用工厂函数,给初始keyi带来一个默认值。

这个默认值也许是空的list[]  defaultdict(list), 也许是0, defaultdict(int).

 

再看看下面的这个例子。

defaultdict(int) 这里的d其实是生成了一个默认为0的带key的数据字典。你可以想象成 d[key] = int default (int工厂函数的默认值为0)

 

d[k]所以可以直接读取 d[“m”] += 1 就是d[“m”] 就是默认值 0+1 = 1

后面的道理就一样了。

1
2
3
4
5
6
7
>>> s  =  'mississippi'
>>> d  =  defaultdict( int )
>>>  for  in  s:
...     d[k]  + =  1
...
>>>  list (d.items())
[( 'i' 4 ), ( 'p' 2 ), ( 's' 4 ), ( 'm' 1 )]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值