Python 为什么不是';不是所有的数据都被存储了吗?

Python 为什么不是';不是所有的数据都被存储了吗?,python,Python,我有一个带有key:value的字典,但是它只保存最后一次迭代,并丢弃之前的条目,在哪里重置??这是迭代的ctr和字典长度的输出 Return the complete Term and DocID Ref. LENGTH:6960 CTR:88699 我的代码: class IndexData: def getTermDocIDCollection(self): ............... for term in terms: #

我有一个带有key:value的字典,但是它只保存最后一次迭代,并丢弃之前的条目,在哪里重置??这是迭代的ctr和字典长度的输出

Return the complete Term and DocID Ref.
LENGTH:6960
CTR:88699
我的代码:

class IndexData:

    def getTermDocIDCollection(self):
        ...............
            for term in terms:
    #TermDocIDCollection[term] = sourceFile['newid']
                TermDocIDCollection[term] = []
                 TermDocIDCollection[term].append(sourceFile['newid'])
        return TermDocIDCollection

您注释掉的代码执行以下操作:

  • 为键设置一个值(删除之前存在的内容(如果存在))
  • 为键设置新值(空列表)
  • 将步骤1中设置的值追加到新的空列表中
  • 不幸的是,它在每次迭代中都会执行相同的操作,因此最终会将
    [last value]
    分配给键。新代码(带有
    更新
    )也有类似的功能。在过去,你会这样做:

    if term in TermDocIDCollection:
        TermDocIDCollection[term].append(sourceFile['newid'])
    else:
        TermDocIDCollection[term] = [sourceFile['newid']]
    
    或者使用
    try
    -
    除了
    之外的主题变体。添加
    集合后,您可以执行以下操作:

    from collections import defaultdict
    
    # ... code...
    
    TermDocIDCollection = defaultdict(list)
    
    您可以这样更新它:

    TermDocIDCollection[term].append(sourceFile['newid'])
    

    无需检查字典中是否存在
    术语
    。如果没有,则
    defaultdict
    类型将首先调用您传递的构造函数(
    list
    )来创建密钥的初始值

    您的意思是文件可能多次包含每个密钥,并且字典仅保留每个密钥的最后一个条目吗?如果这就是你的意思,那就是它的工作原理
    dict.update
    将添加新的键或替换现有的键。哦,这正是发生的事情,但正如你所看到的,我对列表中的部分进行了注释,它也在做同样的事情。我的目标是有步骤2和3(步骤1是另一个尝试)保留所有具有唯一值的重复术语我该怎么做?谢谢注意,我已经发布了两个解决这个问题的方法。一个是经典的(检查字典中是否存在该键:如果存在,则追加;如果它没有创建一个只包含第一个值的新列表),另一个是使用
    defaultdict
    ,如果您的新代码与您现在显示的代码类似,则不,您没有。每次都是盲目地设置
    TermDocIDCollection[term]=[]
    。你需要明白,任何这样的作业都会用新的内容替换以前的内容。KSM:NP,这是经典。您可以找到大量有关StackOverflow的示例:-)总结一下:字典只是一个键值结构,经过优化可以有效地按键恢复信息。可以将相同的值关联到多个关键点,但每个关键点只能显示一次。但是,该值可以是任何值,这意味着您可以按自己喜欢的方式组织一个键的多个值(列表、字符串的重叠等等,取决于您的数据)