Question

Je dois supprimer une paire k / v d'un dictionnaire dans une boucle. Après avoir RuntimeError: dictionary changed size during iteration je le dictionnaire après marinés suppression du k / v et dans l'une des boucles extérieures je tente de rouvrir le nouveau dictionnaire décapé / mise à jour. Cependant, comme beaucoup d'entre vous le savez probablement, je reçois la même erreur, je pense que quand il atteint le sommet de la boucle. Je n'utilise mon dictionnaire dans la boucle extérieure.

Alors ma question est-ce que quelqu'un sait comment contourner ce problème? Je veux supprimer une paire k / V à partir d'un dictionnaire et de l'utilisation que redimensionnée dictionnaire sur la prochaine itération de la boucle.

pour concentrer le problème et utiliser la solution de 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]

Je fais cela parce que je dois avoir des assistants de recherche comparent quelques observations à partir de deux ensembles de données qui ne peuvent être atteinte en raison des variantes de noms. L'idée est de jeter un nom d'un ensemble de données (par exemple l'ensemble A) et basé sur un match clé trouver tous les noms attachés à cette clé dans l'autre ensemble de données (ensemble B). Une correspondance a été identifié, je ne veux pas montrer la valeur de B à nouveau pour accélérer les choses pour eux. Parce qu'il ya 6000 observations que je ne veulent pas qu'ils doivent commencer au début de A chaque fois qu'ils reviennent au travail. Cependant, je peux résoudre ce problème en les laissant choisi d'entrer dans la dernière clé de A ils ont travaillé avec. Mais je vraiment besoin de réduire B une fois que le match a été identifié

Était-ce utile?

La solution

Sans code, je suppose que vous écrivez quelque chose comme:

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

Si oui, vous pouvez écrire

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

list(dict.keys()) renvoie une copie des clés, pas une vue, ce qui permet de supprimer du dictionnaire (vous Itère une copie des clés, pas les clés du dictionnaire lui-même, dans ce cas.)

Autres conseils

Supprimer toutes les clés dont la valeur est> 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]

Changement:

for ansSeries in notmatched:

Pour:

for ansSeries in notmatched.copy():
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top