2012-04-23 42 views
-1

有一个名为Count的类。我应该如何使用defaultdict?

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]?

+0

你正在读入一个'data'文件,然后我们再也看不到'data'。某种程度上它是相关的吗? – 2012-04-23 00:42:21

+0

添加一些上下文并澄清您的问题将鼓励回答,并帮助防止您的问题downvotes。 (p.s.这不是我!) – 2012-04-23 00:56:09

+0

哈哈。这是一个长期的计划,我不知道是否明智地把所有东西都带进去...... – juju 2012-04-23 01:35:06

回答

1

和其他人一样,我不确定我有足够的背景来给予全面的评价。但是,这条线:

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

对我说,counter.form即将结束包含每个令牌/ FILE_NAME组合的独立计数。

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

,指出self.form是一个默认的字典,它的默认值是collection.Counter情况下(这基本上是defaultdict(int)有一些额外的方法,IIRC:这是你说的是计数器的初始化备份)。所以,基本上是一个二维计数器。

如果你想要记号的数量,而不管它们在哪个文件中,那么你基本上不希望file_name是计数器的参数,并且计数器需要是一维的。所以我想看看改变你的计数器的初始化到:

self.form = collections.Counter() 

,改变你的计数递增到:

counter.form[token] += 1 

您可能需要更多的变化的基础上,其余部分的结构的程序。但希望这会让你朝正确的方向发展。

+0

这就是我的意思!现在,在我改变任何东西之前,如何在特定的层面上获得某个词的频率,例如。 token = dog,level = 1,我想获得freq [token] [level]? – juju 2012-04-23 01:33:52

+0

@ user1325302然后你回到使用2维计数器,但使用'level'作为第二维,而不是'file_type' ... – Ben 2012-04-23 02:04:46

+0

伟大的工作唾弃了一个具有挑战性的问题,@Ben。 +1 – 2012-04-24 04:33:50

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 

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

+0

如果我想打印每个'数',该怎么办?写一个循环? print count [0],count [1] 我无法列出所有我想要打印的东西。 – juju 2012-04-23 01:24:33