百度空间 | 百度首页 
 
查看文章
 
统计长文章单词出现频率之defaultdict
2009-08-18 11:07
假设我们要打开一个名为big.txt的大文件做单词出现次数的统计。
千万别写出这样的代码:
import re
word_dict = {}
words = re.findall('[a-z]+', open('big.txt').read().lower())
for w in words:
if w not in word_dict.keys():
word_dict[w] = 1
else:
word_dict[w] += 1
这样如果单词量为m, 词汇量为n的话,就是O(m * n / 2)的复杂度。也千万别为了少判断key是否存在而用try except 获取会出现的KeyError, 比较好的做法是用collections.defaultdict

import re, collections
word_dict = collections.defaultdict(int)
words = re.findall('[a-z]+', open('big.txt').read().lower())
for w in words:
word_dict[w] += 1
这样所有出现的Key都会天生附带上一个默认值,不需要在引用前先行赋值。这样直接的好处就是复杂度直接变为O(n), 当然defaultdict还有不少其它用法,有兴趣的话可以help之。

类别:默认分类 | 浏览() | 评论 (6)
 
网友评论:
1
2009-08-18 11:26 | 回复
我靠,太太虎了
 
2
2009-08-18 12:08 | 回复
这么虎的小费也给我留言啊 太虎了 蓬荜生辉啊
 
3
2009-08-18 14:26 | 回复
上面那种显然是有点Java思路,我在Perl里面也写过同样的代码,用的也是你的第二种方法,没有做判断,让hash的每个key用默认的value就行了。

 
4
2009-08-18 14:26 | 回复
对了word_dict的两种初始化方式有什么区别?
 
5
2009-08-18 16:41 | 回复
回复jessiejacky:
collections.defaultdict(int)
就是传个函数int() 表达对于什么key应该有什么样的默认值,dict也行
 
6
2009-08-18 16:55 | 回复
回复overboming:soga, 看来perl这点很“强大”,它的缺省值是UNDEF;然后根据不同的context会自动转变。
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu