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

Python';字典在迭代期间更改了大小';即使迭代后的大小更改应该完成,也会出现错误,python,dictionary,size,iteration,Python,Dictionary,Size,Iteration,我有一个城市列表,我正试图根据距离将它们分组。我正在浏览城市列表。列表中的第一个城市没有可比较的对象,因此它会自动创建自己的城市组。列表中的后续城市将与现有城市组中的所有城市进行比较。如果城市与城市组中的任何城市之间的距离在阈值范围内,则该城市将添加到城市组中。否则,它将创建一个新组。我的组存储为字典,其中一个字典存储城市组,然后每个城市组都有一个字典存储该组中的所有城市 我调用findsetlist(),它检查城市是否应属于现有城市组或创建一个新的城市组。调用findsetlist()后,我会

我有一个城市列表,我正试图根据距离将它们分组。我正在浏览城市列表。列表中的第一个城市没有可比较的对象,因此它会自动创建自己的城市组。列表中的后续城市将与现有城市组中的所有城市进行比较。如果城市与城市组中的任何城市之间的距离在阈值范围内,则该城市将添加到城市组中。否则,它将创建一个新组。我的组存储为字典,其中一个字典存储城市组,然后每个城市组都有一个字典存储该组中的所有城市

我调用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  
class城市场景:
定义初始(自我、城市、城市主题、城市主题):
self.city=城市
self.citysetdct=citysetdct
self.citysetnum=citysetnum
def FindSetList(自):
如果len(self.citysedtict)==0:
赛尔夫城市酒店=1
self.closecitysetnum=1
self.closeval=9999999
self.temp={}
self.temp[self.city[apiad]]=self.city
其他:
self.closecitysetnum=self.citysetnum+1
self.closeval=9999999
self.temp={}
对于self.cityestict中的self.key:
对于self.citySet[self.key]中的self.key2:
self.secondcity=self.citysedtict[self.key][self.key2]
self.compare=cityCompare(self.city,self.secondcity)
self.compare.distance()
如果self.compare.dist
。。。
对于self.citySet[self.key]中的self.key2:
....

如果你能澄清,这里有很多看起来很滑稽的东西。什么是
城市
?什么是apiad
?为什么要尝试使用属性(例如,
self.key
)作为循环变量?
用于self.citysetdct:
中的self.key。哦,天哪。。。为什么不使用
来输入self.citysedtict
?为什么只为迭代创建一个新的实例属性?城市应该是一个列表,apiad是该列表中城市名称的地址。因此,我尝试使用城市名称作为城市组中的一个键。在回答你的另一个问题时,我对面向对象编程非常陌生,我还没有完全弄清楚什么时候我需要在变量前面加“self.”,所以我一直在将它添加到所有变量中。很抱歉没有在self.wellsettict[self.key]中完整地包含错误消息“for self.key2”:RuntimeError:dictionary在迭代过程中更改了大小“感谢您的回答和关于发布礼仪的课程。这是我第一次发帖。我会努力在以后的帖子中做得更好。@user3402834啊,我在你发布的代码中没有看到
wellsetdict
,所以我的猜测可能不是你的问题。很抱歉,我在运行之前更改了一个变量名,并收到了错误消息。应该是:'对于self.citysetdict[key]中的key2:RuntimeError:dictionary在迭代过程中更改了大小'。我已尝试添加'citysets[self.closecitysetnum]=self.temp,其缩进与findcitylist()末尾的'if'和'else'语句相同。我仍然会犯同样的错误。在我进行赋值之前,两个for循环都已通过,赋值如何反馈到for循环?在我分配self.temp后,有没有办法退出,这样它就不能反馈到for循环中?@user3402834为什么你认为是for循环后的分配导致了你的问题?我不认为问题是在for循环之后发生的,所以不管你在那里放了什么。我在您的代码中发现的潜在问题是,您正在分配
temp
以引用您正在迭代的字典,然后在for循环中分配
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