J'ai vérifié toutes les autres questions avec la même erreur mais je n'ai trouvé aucune solution utile = /
J'ai un dictionnaire de listes:
d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
dans lequel certaines des valeurs sont vides. À la fin de la création de ces listes, je souhaite supprimer ces listes vides avant de retourner mon dictionnaire. Actuellement, j'essaie de le faire comme suit:
for i in d:
if not d[i]:
d.pop(i)
cependant, cela me donne l'erreur d'exécution. Je suis conscient que vous ne pouvez pas ajouter / supprimer des éléments dans un dictionnaire tout en le parcourant ... quel serait alors un moyen de contourner cela?
la source
keys
fait une copie des clés que vous pouvez parcourir» alias lesplural
clés, n'est-ce pas? Sinon, comment peut-on répéter sur une seule clé? Soit dit en passant, je ne suis pas en train de choisir, je suis vraiment intéressé de savoir si c'est vraiment la ou les clésfor i in d.keys()
fonctionne en fait dans python 3.x en général , mais parce qu'il itère sur une vue itérable des clés du dictionnaire, appelerd.pop()
pendant la boucle conduit à la même erreur que vous avez trouvée.for i in list(d)
émule le comportement légèrement inefficace de python 2 consistant à copier les clés dans une liste avant l'itération, dans des circonstances spéciales comme la vôtre.list(d.keys())
crée la même sortie quelist(d)
, l'appellist
à adict
renvoie les clés. L'keys
appel (mais pas si cher) n'est pas nécessaire.Utilisez simplement la compréhension du dictionnaire pour copier les éléments pertinents dans un nouveau dict
Pour cela en Python 3
la source
d.iteritems()
m'a donné une erreur. J'ai utilisé à lad.items()
place - en utilisant python3Il vous suffit d'utiliser "copier":
De cette façon, vous parcourez les champs du dictionnaire d'origine et à la volée, vous pouvez changer le dict souhaité (d dict). Cela fonctionne sur chaque version de python, donc c'est plus clair.
la source
J'essaierais d'éviter d'insérer des listes vides en premier lieu, mais j'utiliserais généralement:
Si avant 2.7:
ou juste:
la source
Pour Python 3:
la source
Vous ne pouvez pas parcourir un dictionnaire pendant qu'il change pendant la boucle for. Faire un casting pour lister et itérer sur cette liste, ça marche pour moi.
la source
Pour des situations comme celle-ci, j'aime faire une copie complète et boucler cette copie tout en modifiant le dict original.
Si le champ de recherche se trouve dans une liste, vous pouvez énumérer dans la boucle for de la liste, puis spécifier la position comme index pour accéder au champ dans le dict d'origine.
la source
Cela a fonctionné pour moi:
La conversion des éléments du dictionnaire en liste crée une liste de ses éléments, de sorte que vous pouvez itérer dessus et éviter le
RuntimeError
.la source
dictc = {"stName": "asas"} keys = dictc.keys () pour la clé dans la liste (keys): dictc [key.upper ()] = 'New value' print (str (dictc))
la source
La raison de l'erreur d'exécution est que vous ne pouvez pas parcourir une structure de données pendant que sa structure change pendant l'itération.
Une façon d'atteindre ce que vous recherchez consiste à utiliser la liste pour ajouter les clés que vous souhaitez supprimer, puis à utiliser la fonction pop sur le dictionnaire pour supprimer la clé identifiée tout en parcourant la liste.
la source
Python 3 n'autorise pas la suppression lors de l'itération (à l'aide de la boucle ci-dessus) du dictionnaire. Il existe différentes alternatives à faire; une façon simple est de changer la ligne suivante
Avec
la source