我该如何使用defaultdict?

时间:2012-04-23 00:20:26

标签: python

有一个名为Count的类。

def __init__(self, caters):
    self.form = collections.defaultdict(collection.Counter)
    self.caters = {caters: Catergory(caters) for caters in cats}

我从一些文件中读取信息并给它赋值,

def read_file(file_name, level, counters):
    data = open(file_name).read()
    counters.caters[level].docs.add(file_name)
    for token in blabla:
        counter.form[token][file_name] += 1

如果我想获得每个令牌的总频率而不管它在哪个文件中,我该怎么办?

如何获得特定级别的某个单词的频率,例如。令牌的名称是dog,level = 1,我想获得freq [dog] [1]?

2 个答案:

答案 0 :(得分:1)

和其他人一样,我不确定我是否有足够的背景来提供任何全面的内容。但是这一行:

counter.form[token][file_name] += 1

对我说,counter.form最终将包含每个token / file_name组合的单独计数。这可以通过您所说的计数器初始化来支持:

self.form = collections.defaultdict(collections.Counter)

这表示self.form是一个默认字典,其默认值是collection.Counter的实例(基本上defaultdict(int)有一些额外的方法,IIRC)。所以,基本上是一个二维计数器。

如果您想要令牌数量而不管他们所处的文件是什么,那么您基本上不希望file_name成为计数器的参数,并且计数器需要是1维的。所以我想把你的计数器的初始化改为:

self.form = collections.Counter()

并将您的计数递增至:

counter.form[token] += 1

根据程序其余部分的结构,您可能需要进行更多更改。但希望这会让你朝着正确的方向前进。

答案 1 :(得分:0)

我使用collections.defaultdict(int)来计算令牌的实例。您可以在您感兴趣的所有文件中应用这样的代码,为每个文件使用相同的令牌计数器集合(在我的示例中为token_counts):

token_counts = collections.defaultdict(int)
with open('foo.txt') as f:
    for line in f:
        for token in line.split():
            token_counts[token] += 1
for token, count in token_counts.items():
    print token, count

我必须承认我发现你的问题有点模糊。这是我对你要找的东西的最好猜测。