116 votes

Meilleur moyen de supprimer un élément d’un dictionnaire Python?

Quel est le meilleur moyen de supprimer un élément d'un dictionnaire? Voici une approche simple:

 for key, item in some_dict.items():
    if item is item_to_remove:
        del some_dict[key]
 

Y a-t-il de meilleurs moyens? Y a-t-il un problème avec la mutation (suppression d'éléments) du dictionnaire lors de sa répétition?

118voto

N 1.1 Points 7687
>>> dic = {'a':1, 'b':2}
>>> dic
{'a': 1, 'b': 2}
>>> dic.pop('c', 0)
0
>>> dic.pop('a', 0)
1
>>> dic
{'b': 2}

93voto

Tim Pietzcker Points 146308

Être conscient que vous êtes en train de tester pour l'identité de l'objet (is seulement des retours True si les deux opérandes sont représentés par le même objet en mémoire ce n'est pas toujours le cas avec les deux objet que de comparer l'égalité avec ==). Si vous faites cela sur le but, alors vous pouvez réécrire votre code

some_dict = {key: value for key, value in some_dict.items() 
             if value is not value_to_remove}

Mais cela ne peut pas faire ce que vous voulez:

>>> some_dict = {1: "Hello", 2: "Goodbye", 3: "You say yes", 4: "I say no"}
>>> value_to_remove = "You say yes"
>>> some_dict = {key: value for key, value in some_dict.items() if value is not value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 3: 'You say yes', 4: 'I say no'}
>>> some_dict = {key: value for key, value in some_dict.items() if value != value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 4: 'I say no'}

Donc, vous voulez probablement, != au lieu de is not.

52voto

kracekumar Points 2653
a = {'name': 'your_name','class': 4}
if 'name' in a: del a['name']

42voto

Luu Tuan Anh Points 188

Une simple comparaison entre del et pop () :

 import timeit
code = """
results = {'A': 1, 'B': 2, 'C': 3}
del results['A']
del results['B']
"""
print timeit.timeit(code, number=100000)
code = """
results = {'A': 1, 'B': 2, 'C': 3}
results.pop('A')
results.pop('B')
"""
print timeit.timeit(code, number=100000)
 

résultat:

 0.0329667857143
0.0451040902256
 

Donc, del est plus rapide que pop () .

7voto

mithrandi Points 945

items() renvoie une liste, et c'est cette liste que vous êtes en train d'itérer. La mutation du dict dans la boucle n'a donc pas d'importance ici. Si vous utilisiez iteritems() place, la mutation du dict dans la boucle serait problématique , et également pour viewitems() en Python 2.7.

Je ne peux pas penser à un meilleur moyen de supprimer des éléments d'un dict par valeur.

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