3

我需要在循环中从字典中删除 ak/v 对。在RuntimeError: dictionary changed size during iteration删除 k/v 并在其中一个外部循环中我尝试重新打开新腌制/更新的字典后,我腌制了字典。然而,你们中的许多人可能都知道——我得到了同样的错误——我想当它到达循环的顶部时。我不在最外层循环中使用我的字典。

所以我的问题是——有人知道如何解决这个问题吗?我想从字典中删除 ak/V 对,并在循环的下一次迭代中使用调整大小的字典。

聚焦问题并使用 Cygil 的解决方案

list=[27,29,23,30,3,5,40]
testDict={}
for x in range(25):
    tempDict={}
    tempDict['xsquared']=x*x
    tempDict['xinverse']=1.0/(x+1.0)
    testDict[(x,x+1)]=tempDict

for item in list:
    print 'the Dictionary now has',len(testDict.keys()), ' keys'
    for key in testDict.keys():
        if key[0]==item:

        del testDict[key]

我这样做是因为我必须让一些研究助理比较两个数据集的一些观察结果,这些数据集由于名称变体而无法匹配。这个想法是从一个数据集(比如集合 A)中抛出一个名称,然后根据键匹配在另一个数据集(集合 B)中找到附加到该键的所有名称。已经确定了一个匹配项,我不想再次显示 B 的值以加快他们的速度。因为有 6,000 次观察,我也不希望他们每次重新开始工作时都必须从 A 的开头开始。但是,我可以通过让他们选择输入他们使用的 A 中的最后一个键来解决这个问题。但是一旦确定匹配项,我真的需要减少 B

4

3 回答 3

6

没有代码,我假设您正在编写如下内容:

for key in dict:
    if check_condition(dict[key]):
       del dict[key]

如果是这样,你可以写

for key in list(dict.keys()):
    if key in dict and check_condition(dict[key]):
        del dict[key]

list(dict.keys())返回键的副本,而不是视图,这使得可以从字典中删除(在这种情况下,您正在遍历键的副本,而不是字典本身中的键。)

于 2009-04-03T01:28:50.877 回答
4

删除所有值 > 15 的键:

for k in mydict.keys(): # makes a list of the keys and iterate
                        # over the list, not over the dict.
    if mydict[k] > 15:
        del mydict[k]
于 2009-04-03T01:23:22.340 回答
1

改变:

for ansSeries in notmatched:

到:

for ansSeries in notmatched.copy():
于 2009-04-03T02:10:49.060 回答