Comment supprimer une clé d'un dictionnaire Python?

en essayant de supprimer une clé d'un dictionnaire, j'écris:

if 'key' in myDict:
    del myDict['key']

y a-t-il une seule façon de faire cela?

1102
demandé sur Peter Mortensen 2012-07-01 00:27:59

8 réponses

Utilisation dict.pop() :

my_dict.pop('key', None)

cela retournera my_dict[key] si key existe dans le dictionnaire, et None autrement. Si le second paramètre n'est pas spécifié (ie. my_dict.pop('key') ) et key n'existe pas, un KeyError est déclenché.

1849
répondu Sven Marnach 2016-08-05 23:23:34

Spécifiquement pour répondre à "est-il une ligne de chemin de faire cela?"

if 'key' in myDict: del myDict['key']

...Eh bien, vous demandé ; -)

vous devriez considérer, cependant, que cette façon de supprimer un objet d'un dict est pas atomique -il est possible que 'key' peut être dans myDict pendant la déclaration if , mais peut être supprimé avant del est exécuté, dans ce cas del échouera avec un KeyError . Compte tenu de cela, il serait plus sûr de utiliser dict.pop ou quelque chose du genre

try:
    del myDict['key']
except KeyError:
    pass

qui, bien sûr, est certainement et non un one-liner.

270
répondu zigg 2017-05-23 11:47:32

il m'a fallu un certain temps pour comprendre ce que fait exactement my_dict.pop("key", None) . Je vais donc ajouter ceci comme réponse pour sauver d'autres googling time:

pop(touche [par défaut])

si la clé est dans le dictionnaire, retirez-la et retournez sa valeur, sinon retour par défaut. Si le défaut n'est pas donné et la clé n'est pas dans le dictionnaire, un KeyError est soulevée

Documentation

117
répondu Akavall 2015-02-27 17:29:44

des trois solutions décrites ci-dessus.

Petit Dictionnaire:

>>> import timeit
>>> timeit.timeit("d={'a':1}; d.pop('a')")
0.23399464370632472
>>> timeit.timeit("d={'a':1}; del d['a']")
0.15225347193388927
>>> timeit.timeit("d={'a':1}; d2 = {key: val for key, val in d.items() if key != 'a'}")
0.5365207354998063

plus grand dictionnaire:

>>> timeit.timeit("d={nr: nr for nr in range(100)}; d.pop(3)")
5.478138627299643
>>> timeit.timeit("d={nr: nr for nr in range(100)}; del d[3]")
5.362219126590048
>>> timeit.timeit("d={nr: nr for nr in range(100)}; d2 = {key: val for key, val in d.items() if key != 3}")
13.93129749387532
27
répondu Peter Smit 2016-12-07 12:19:22

si vous avez besoin de supprimer beaucoup de clés d'un dictionnaire dans une ligne de code, je pense que l'utilisation de map() est tout à fait succinct et Pythonic lisible:

myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}

et si vous avez besoin d'attraper des erreurs où vous pop une valeur qui n'est pas dans le dictionnaire, utilisez lambda inside map () comme ceci:

map(lambda x: myDict.pop(x,None), ['a','c','e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}

ça marche. Et 'e' n'a pas causé d'erreur, même si myDict n'avait pas de clé 'e'.

21
répondu Marc Maxson 2018-05-29 13:53:09

utiliser:

>>> if myDict.get(key): myDict.pop(key)

une Autre façon:

>>> {k:v for k, v in myDict.items() if k != 'key'}

vous pouvez supprimer par conditions. Aucune erreur si key n'existe pas.

15
répondu Shameem 2018-05-29 13:54:23

utilisant le mot-clé "del":

del dict[key]
6
répondu Sarthak Gupta 2018-05-29 13:55:39

nous pouvons supprimer une clé d'un dictionnaire Python par les quelques approches suivantes.

utilisant le mot-clé del ; c'est presque la même approche que vous l'avez fait -

 myDict = {'one': 100, 'two': 200, 'three': 300 }
 print(myDict)  # {'one': 100, 'two': 200, 'three': 300}
 if myDict.get('one') : del myDict['one']
 print(myDict)  # {'two': 200, 'three': 300}

ou

on peut faire comme suit:

mais il faut garder à l'esprit que, dans ce processus en fait il ne sera pas supprimer toute clé du dictionnaire plutôt que de faire la clé spécifique excluait de ce dictionnaire. De plus, j'ai observé qu'il retournait un dictionnaire qui n'était pas commandé de la même façon que myDict .

myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}

si nous l'exécutons dans le shell, il exécutera quelque chose comme {'five': 500, 'four': 400, 'three': 300, 'two': 200} - notez que ce n'est pas le même ordre que myDict . Encore une fois si nous essayons d'imprimer myDict , alors nous pouvons voir toutes les clés dont nous avons exclu du dictionnaire par cette approche. Cependant, nous pouvons faire un nouveau dictionnaire en assignant l'énoncé suivant dans une variable:

var = {key:value for key, value in myDict.items() if key != 'one'}

maintenant si nous essayons de l'imprimer, alors il suivra l'ordre parent:

print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}

ou

utilisant la méthode pop() .

myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)

if myDict.get('one') : myDict.pop('one')
print(myDict)  # {'two': 200, 'three': 300}

la différence entre del et pop est que, en utilisant la méthode pop() , nous pouvons réellement stocker la valeur de la clé si nécessaire, comme le suivant:

myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var)    # 100
5
répondu iPython 2018-05-29 13:58:04