Python'字典在迭代期间改变了大小'错误,即使迭代后的大小更改应该完成

时间:2014-03-10 20:50:19

标签: python dictionary size iteration

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

我正在调用findsetlist(),它会检查该城市是否属于现有城市群或创建新城市群。在调用findsetlist()之后,我将城市组字典更新为将城市添加到现有组或创建新组。当我运行代码时,我收到一个错误,表示"字典在迭代期间改变了大小"。这是说我正在改变我的字典的大小,而它正在迭代我的' 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  

1 个答案:

答案 0 :(得分:1)

            ...
            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循环中的一条线(这也大大缩小了哪个字典是问题) 。但即使您还不知道如何阅读错误信息中打印的堆栈跟踪来进行此类问题识别(这很好,每个人都必须学习一段时间),当您向其他人寻求帮助时请包含错误消息,以便帮助您的人可以利用这个线索!