Je dois supprimer tous les éléments qui ont une valeur None pour une certaine clé dict dans un ensemble python. Étant donné un ensemble simple:

In [7]: z
Out[7]: {None, 1, 2}

In [8]: for item in z:
   ...:     if not item:
   ...:         z.remove(item)
   ...:         
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-8-680a51a37622> in <module>()
----> 1 for item in z:
      2     if not item:
      3         z.remove(item)
      4 

RuntimeError: Set changed size during iteration

Je ne vois pas pourquoi, mais cela ne me permettra pas de supprimer des objets pendant l'itération. Comment puis-je exécuter une vérification de vérité dynamique et supprimer des éléments des ensembles? Je vous remercie

0
codyc4321 6 mars 2016 à 02:55

3 réponses

Meilleure réponse

Rob a une bonne réponse si vous souhaitez conserver la structure de votre code; sinon, vous pouvez utiliser une compréhension pour le faire sur une seule ligne.

example_set = {None, 1, 2}
filtered_set = {item for item in example_set if item}

print(filtered_set) # {1, 2}

Si votre logique est plus complexe que simplement if item, alors il vaut probablement mieux garder la boucle for.

2
Jared Goguen 6 mars 2016 à 00:26

Cette erreur est très courante lorsque le cycle for est utilisé pour parcourir une liste ou un dictionnaire. Le problème est que vous avez l'intention de modifier le contenu du dictionnaire pendant que vous parcourez ce document.

Dans ce cas, une solution consiste à utiliser un index pour parcourir le dictionnaire, quelque chose comme:

for i in range( len(dic) ):

Mais vous utilisez SET, l'objet SET en python 3 a une méthode appelée discard que vous pouvez utiliser pour faire ce que vous vouliez. Par exemple:

z = {None, 1, 2}
z.discard(None)
print(z)
0
Edison Javier Herran Cortes 6 mars 2016 à 00:19

Essayez d'abord de faire une copie de l'ensemble:

for item in list(z):
    if not item:
        z.remove(item)
2
Robᵩ 5 mars 2016 à 23:58