为什么list()。append()给我重复的值?

时间:2019-11-30 02:26:44

标签: python list

当我将字符串列表传递给此函数时,我希望它返回一个矩阵,说明每个唯一单词出现在字符串中的次数,但是,我得到一个矩阵,其中第一个字符串的值重复4次。 这是代码

def tf(corp):
words_set = set()
for i in corp:
    a=i.split(' ')
    for j in a:
        words_set.add(j)
words_dict = {i:0 for i in words_set}
wcount=0
matr=list()
for doc in corp:
    for worduni in words_dict:
        count=0

        for words in doc.split(' '):
            if words==worduni:

                count+=1
        words_dict[worduni]=count/len(doc.split(' '))
    print(words_dict)
    matr.append(words_dict)   

return matr

当我打印matr的值时,我得到
[{'the':0.2,   “第一”:0.2,   '文档':0.2,   '第三':0.0,   '是':0.2,   '一个':0.0,   '和':0.0,   'this':0.2,   'second':0.0},  {'the':0.2,   “第一”:0.2,   '文档':0.2,   '第三':0.0,   '是':0.2,   '一个':0.0,   '和':0.0,   'this':0.2,   'second':0.0},  {'the':0.2,   “第一”:0.2,   '文档':0.2,   '第三':0.0,   '是':0.2,   '一个':0.0,   '和':0.0,   'this':0.2,   'second':0.0},  {'the':0.2,   “第一”:0.2,   '文档':0.2,   '第三':0.0,   '是':0.2,   '一个':0.0,   '和':0.0,   'this':0.2,   'second':0.0}]

2 个答案:

答案 0 :(得分:1)

您的代码正在执行的操作是将相同的对象(word_dict)重复添加到matr中。自然地,由于matr是一个列表,它可以处理此…,您将对同一词典有多个引用。同时,您正在更新字典。因此,当您打印列表时,看到的是字典的最终状态... N次。

现在,我怀疑您打算将word_dict状态的快照保存在matr中。但是,如果要这样做,则需要将word_dict保存在matr中;例如

    matr.append(words_dict.copy())

另一方面,如果您打算为doc中的每个corp生成一个单独的词频字典,则需要在外部移动word_dict的创建和初始化循环。


与上述情况分开,计算字数和计算频率的方式似乎是完全错误的。我假设这就是您尝试在这里做的事情。


注意:如果您使用更有意义的方法和变量名和/或在代码中添加适当的注释,其他人将更容易理解打算要执行的代码。

答案 1 :(得分:0)

我对此进行了修改,以使您获得与打印件相同的非重复数据:

 @Override
  public void onBindViewHolder(@NonNull BirdView holder, int position) {
       holder.birdImage.setImageResource(birdList.get(position).getImage());
    }