当前位置: 代码迷 >> python >> Python“字典在迭代过程中更改了大小”错误,即使迭代后应该完成了大小更改
  详细解决方案

Python“字典在迭代过程中更改了大小”错误,即使迭代后应该完成了大小更改

热度:106   发布时间:2023-06-21 10:49:57.0

我有一个城市列表,我正在尝试根据距离将它们分组。 我正在遍历城市清单。 列表中的第一个城市没有可比较的内容,因此它会自动创建自己的城市组。 将列表中的后续城市与现有城市组中的所有城市进行比较。 如果城市在城市组中任何城市的阈值距离内,则将其添加到城市组中。 否则,它将创建一个新组。 我的组作为字典存储,其中一本字典存储城市组,然后每个城市组都有一本字典,存储该组中的所有城市。

我在调用findsetlist(),在其中检查城市是否应该属于现有的城市组或创建一个新的城市组。 在调用findsetlist()之后,我随后通过将城市添加到现有组或创建新组来更新城市组字典。 运行代码时,出现一个错误,提示“字典在迭代过程中更改了大小”。 就是说,我在“ for循环”内部迭代时正在更改字典的大小。 但是,直到它退出两个“ for循环”之后,我才更改大小,所以我不明白为什么它有问题。

感谢您能给我的任何帮助。 谢谢。

class citySets:  
    def __init__(self,city,citysetdict,citysetnum):  
        self.city=city  
        self.citysetdict=citysetdict  
        self.citysetnum=citysetnum  
    def findsetlists(self):  
        if len (self.citysetdict)==0:  
            self.citysetnum=1  
            self.closecitysetnum=1  
            self.closeval=9999999999  
            self.temp={}  
            self.temp[self.city[apiad]]=self.city  
        else:  
            self.closecitysetnum=self.citysetnum+1  
            self.closeval=9999999999  
            self.temp={}  
            for self.key in self.citysetdict:  
                for self.key2 in self.citysetdict[self.key]:  
                    self.secondcity= self.citysetdict[self.key][self.key2]  
                    self.compare=cityCompare(self.city,self.secondcity)  
                    self.compare.distance()  
                    if self.compare.dist<=distancethreshold:  
                        self.closecitysetnum=self.key  
                        self.temp = self.citysetdict[self.key]  
                        self.temp[self.city[apiad]]=self.city  

citysets={}  
for currentcity in citylist:  
    d=citySets(currentcity,citysets,citysetnum)  
    d.findsetlists()  
    citysetnum=d.closecitysetnum  
    citysets[citysetnum]=d.temp  
            ...
            for self.key2 in self.citysetdict[self.key]:
                 ....
                 if self.compare.dist<=distancethreshold: 
                    ...
                    self.temp = self.citysetdict[self.key]
                    self.temp[self.city[apiad]]=self.city

这看起来像您的问题。 您正在遍历字典self.citysetdict[self.key] 然后,将self.citysetdict[self.key]分配给self.temp ,然后分配一个self.temp项(除非密钥已经存在,否则它将改变其大小)。

顺便说一句,当Python报告有关“字典大小在迭代期间更改”的错误时, 它将确切地告诉您问题所在 该线索可能使您避免对for循环结束之前才更改大小的困惑,因为它显然指向了for循环中的一行(这也大大缩小了问题所在的字典范围) 。 但是,即使您还不知道如何读取错误消息中打印的堆栈跟踪信息以进行此类问题识别(很好,每个人都必须学习一些时间),当您向其他人寻求帮助时,请包括错误消息 ,以便帮助您的人们可以利用此提示!