Suppression de plusieurs clés d'un dictionnaire en toute sécurité
Je sais supprimer une entrée, 'key' de mon dictionnaire d
, en toute sécurité, vous le faites:
if d.has_key('key'):
del d['key']
Cependant, je dois supprimer plusieurs entrées du dictionnaire en toute sécurité. Je pensais à définir les entrées dans un tuple car je devrai le faire plus d'une fois.
entitiesToREmove = ('a', 'b', 'c')
for x in entitiesToRemove:
if d.has_key(x):
del d[x]
Cependant, je me demandais s'il y avait une façon plus intelligente de le faire?
9 réponses
Pourquoi pas comme ceci:
entries = ('a', 'b', 'c')
the_dict = {'b': 'foo'}
def entries_to_remove(entries, the_dict):
for key in entries:
if key in the_dict:
del the_dict[key]
Une version plus compacte a été fournie par mattbornski en utilisant dict.pop()
d = {'some':'data'}
entriesToRemove = ('any', 'iterable')
for k in entriesToRemove:
d.pop(k, None)
En Utilisant Dict Compréhensions
final_dict = {key: t[key] for key in t if key not in [key1, key2]}
Où key1 et cle2 doivent être supprimées.
Dans l'exemple ci-dessous, les clés "b" et "c" doivent être supprimées et conservées dans une liste de clés.
>>> a
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
>>> keys = ["b", "c"]
>>> print {key: a[key] for key in a if key not in keys}
{'a': 1, 'd': 4}
>>>
Si vous deviez également récupérer les valeurs des clés que vous supprimez, ce serait un très bon moyen de le faire:
valuesRemoved = [d.pop(k, None) for k in entitiesToRemove]
Vous pouvez bien sûr toujours le faire juste pour la suppression des clés de d
, mais vous créeriez inutilement la liste de valeurs avec la compréhension de la liste. Il est également un peu difficile d'utiliser une compréhension de liste juste pour l'effet secondaire de la fonction.
Une solution utilise les fonctions map
et filter
Python 2
d={"a":1,"b":2,"c":3}
l=("a","b","d")
map(d.__delitem__, filter(d.__contains__,l))
print(d)
Python 3
d={"a":1,"b":2,"c":3}
l=("a","b","d")
list(map(d.__delitem__, filter(d.__contains__,l)))
print(d)
Vous obtenez:
{'c': 3}
Je n'ai aucun problème avec l'une des réponses existantes, mais j'ai été surpris de ne pas trouver cette solution:
keys_to_remove = ['a', 'b', 'c']
my_dict = {k: v for k, v in zip("a b c d e f g".split(' '), [0, 1, 2, 3, 4, 5, 6])}
for k in keys_to_remove:
try:
del my_dict[k]
except KeyError:
pass
assert my_dict == {'d': 3, 'e': 4, 'f': 5, 'g': 6}
Note: je suis tombé sur cette question venant de ici . Et ma réponse est liée à cette réponse.
Pourquoi pas:
entriestoremove = (2,5,1)
for e in entriestoremove:
if d.has_key(e):
del d[e]
Je ne sais pas ce que vous entendez par "manière plus intelligente". Il existe sûrement d'autres moyens, peut-être avec des compréhensions de dictionnaire:
entriestoremove = (2,5,1)
newdict = {x for x in d if x not in entriestoremove}
Inline
import functools
#: not key(c) in d
d = {"a": "avalue", "b": "bvalue", "d": "dvalue"}
entitiesToREmove = ('a', 'b', 'c')
#: python2
map(lambda x: functools.partial(d.pop, x, None)(), entitiesToREmove)
#: python3
list(map(lambda x: functools.partial(d.pop, x, None)(), entitiesToREmove))
print(d)
# output: {'d': 'dvalue'}
Je suis en retard à cette discussion mais pour quelqu'un d'autre. Une solution peut être de créer une liste de clés en tant que tel.
k = ['a','b','c','d']
Ensuite, utilisez pop() dans une compréhension de liste, ou for loop, pour itérer sur les clés et pop une à la fois en tant que telle.
new_dictionary = [dictionary.pop(x, 'n/a') for x in k]
'n/a' est dans le cas où la clé n'existe pas, une valeur par défaut doit être renvoyé.