python - 为什么 list().append() 给我重复的值?

标签 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 的值时,我得到
[{'该':0.2, “第一”:0.2, “文档”:0.2, “第三”:0.0, "is":0.2, “一”:0.0, “和”:0.0, “这个”:0.2, “第二”:0.0}, {'该':0.2, “第一”:0.2, “文档”:0.2, “第三”:0.0, "is":0.2, “一”:0.0, “和”:0.0, “这个”:0.2, “第二”:0.0}, {'该':0.2, “第一”:0.2, “文档”:0.2, “第三”:0.0, "is":0.2, “一”:0.0, “和”:0.0, “这个”:0.2, “第二”:0.0}, {'该':0.2, “第一”:0.2, “文档”:0.2, “第三”:0.0, "is":0.2, “一”:0.0, “和”:0.0, “这个”:0.2, '第二':0.0}]

最佳答案

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

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

    matr.append(words_dict.copy())

另一方面,如果您打算为 corp 中的每个 doc 生成单独的词频词典,那么您需要移动 的创建和初始化>word_dict 位于外循环内。

<小时/>

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

<小时/>

注意:如果您使用更有意义的方法和变量名称和/或向您的代码添加适当的注释,其他人将更容易理解您的代码的意图。 p>

关于python - 为什么 list().append() 给我重复的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59112664/

相关文章:

python - Django 中多对多字段的 PATCH

python - 请求示例代码来了解返回值的协程中 throw() 的返回值

python - 主题或标签建议算法

list - 在 Prolog 中以列表形式存储和显示结果

python - 将 "list of tuples"转换为平面列表或矩阵

python-3.x - 如何从python中的列表中删除特殊字符

python - 如何将 csv 转换并格式化为列表列表,其中标题名称包含在值中

python - 从 C 调用 python hello world 函数,解析字符串参数

python - 如何在django中使用不同的表注册不同类型的用户?

java - 计算 FilteredList 中项目(元素)的平均值