增加字典中的值

Incrementing a value inside a dictionary

我正在尝试对一袋词建模。当在我的数据(类型系列)中找到该词时,我在字典中增加计数器时遇到了一些问题:

def build_voc(self, data):
        for document in data:
            for word in document.split(' '):
                if word in self.voc:
                    self.voc_ctr[word] = self.voc_ctr[word] + 1
                else:
                    self.voc.append(word)
                    self.voc_ctr = 1

我也尝试用这种方式对其进行索引,只是为了测试错误出在哪里:

self.voc_ctr[word][0] = self.voc_ctr[word][0] + 1

但在那一行仍然给我同样的错误:

TypeError: 'int' object is not subscriptable

知道这是同一个class中的函数,其中定义了self.voc和self.voc_ctr:

class BV:
    def __init__(self):
        self.voc = []
        self.voc_ctr = {}

    def build_voc(self, data):
        for document in data:
            for word in document.split(' '):
                if word in self.voc:
                    self.voc_ctr[word] = self.voc_ctr[word] + 1
                else:
                    self.voc.append(word)
                    self.voc_ctr = 1

错误好像是说self.voc_ctr是一个int对象,但是我定义成list所以不知道哪里错了

   def build_voc(self, data):
    for document in data:
        for word in document.split(' '):
            if word in self.voc:
                self.voc_ctr[word] = self.voc_ctr[word] + 1
            else:
                self.voc.append(word)
                self.voc_ctr = 1       ## <-------- The function fails here

你的方法不是best/optimal的方法,你不需要先检查列表然后将其添加到字典

字典本身是检查单词是否存在的最好方法

尝试使用修改后的版本

   voc_ctr = {}
   def build_voc(data):
    for document in data:
        for word in document.split(' '):
            if word in voc:
                voc_ctr[word] += 1
            else:
                voc_ctr = 1

您的代码不会首先进入您的“if”语句,它会进入您的“else”并将您的 self.voc_ctr 初始化为整数 1。

您似乎有更多的事情要做,而不仅仅是一个不工作的计数器。在这部分代码中:

if word in self.voc:
    self.voc_ctr[word] = self.voc_ctr[word] + 1

...你说的是“如果这个词在我的列表中,创建一个包含该词的字典条目,并在新条目之后为其分配条目的值。”一旦您更正了最初的 'int' 错误,您将得到一个 KeyError。由于 self.voc_ctr[word] 在赋值操作完成后才会存在,因此 self.voc_ctr[word] + 1 也不存在。

要为每个单词实现一个计数器,请尝试这样做:

if word in self.voc:
    self.voc_ctr[word] = 1
else:
    self.voc_ctr[word] = 0

我不知道你还需要用这个程序做什么,但这将解决你的反问题。