web-dev-qa-db-fra.com

Supprimer un élément du dictionnaire si la clé existe

Existe-t-il un autre moyen de supprimer un élément du dictionnaire uniquement si la clé donnée existe, autre que:

if key in mydict:
    del mydict[key]

Le scénario est que je reçois une collection de clés à supprimer d'un dictionnaire donné, mais je ne suis pas certain qu'elles existent toutes dans le dictionnaire. Juste au cas où je manquerais une solution plus efficace.

221
Simon Hughes

Vous pouvez utiliser dict.pop :

_ mydict.pop("key", None)
_

Notez que si le deuxième argument, c'est-à-dire None n'est pas fourni, KeyError est déclenché si la clé ne figure pas dans le dictionnaire. Fournir le deuxième argument empêche l'exception conditionnelle.

474
Adem Öztaş

Il y a aussi:

try:
    del mydict[key]
except KeyError:
    pass

Cela ne fait qu’une seule recherche au lieu de 2. Cependant, les clauses except coûtent cher. Par conséquent, si vous frappez fréquemment la clause except, celle-ci sera probablement moins efficace que ce que vous avez déjà.

11
mgilson

Approche: calculer les clés à supprimer, modifier le dict

Appelons keys la liste/l’itérateur de clés que vous devez supprimer. Je ferais ceci:

keys_to_remove = set(keys).intersection(set(mydict.keys()))
for key in keys_to_remove:
    del mydict[key]

Vous calculez dès le départ tous les éléments concernés et vous les manipulez.

Approche: calculer les clés à garder, faire un nouveau dict avec ces clés

Je préfère créer un nouveau dictionnaire que de le transformer en un dictionnaire existant, aussi je considérerais probablement ceci aussi:

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = {k: v for k, v in mydict.iteritems() if k in keys_to_keep}

ou:

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = {k: mydict[k] for k in keys_to_keep}
5
hughdbrown