2 votes

Parcourir un `OrderedDict` et supprimer certaines de ses clés?

Supposons que j'ai un OrderedDict od avec des clés entières et des valeurs entières. Je veux itérer sur od et supprimer des éléments de od en fonction de la valeur que je trouve. Fondamentalement, ce que je veux réaliser est :

od = {1: 2, 2: 4, 3: 5}

for key in od:
    del od[key]

À la fin, je veux que od soit égal à {1: 2, 3: 5}. Python ne permet pas de modifier la taille d'un OrderedDict pendant son itération. Est-il possible de surmonter ce problème ?

Je travaille avec Python 3.5

4voto

Moinuddin Quadri Points 27539

Cela s'explique par le fait que vous ne pouvez pas modifier la longueur de dict tout en itérant dessus. Au lieu de cela, vous devez itérer sur la copie de la liste des clés à l'intérieur du dict comme suit :

# Pour Python 3.x et 2.7
>>> for key in list(od):
...     del od[key]
...
>>> od
{}

Cependant, en Python 2.7, on peut même utiliser dict.keys() pour obtenir le même comportement :

# En Python 2.7
>>> for key in od.keys():
...     del od[key]
...
>>> od
{}

2voto

Voici la manière la plus facile que je connaisse. Profitez-en !

Avec dicts, vous ne pouvez pas changer la longueur du dictionnaire. Cependant, ce que vous pouvez faire est de créer une copie de liste du dictionnaire d'origine et l'utiliser pour itérer à travers le dictionnaire d'origine. comme indiqué ci-dessous

od = {'a': 2, 'b': 4, 'c': 5}

for key in list(od):
        if key == 'b':
            print(key)
            del od[key]
            print(od)

0voto

f5r5e5d Points 2435

Je pense que c'est ce que vous voulez faire

od = {1: 2, 2: 4, 3: 5}

for key in od.copy():                 # itérer sur une copie
    if key in od and od[key] in od:   # vérifier à la fois la clé et la clé 'cible'
        del od[od[key]]               # ensuite supprimer la cible avec un index indirect

od
Out[52]: {1: 2, 3: 5}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X