Question Comment supprimer une clé d'un dictionnaire Python?


Lorsque j'essaie de supprimer une clé d'un dictionnaire, j'écris:

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

Y a-t-il une façon d'y parvenir?


1048
2018-06-30 20:27


origine


Réponses:


Utilisation dict.pop():

my_dict.pop('key', None)

Cela reviendra my_dict[key] si key existe dans le dictionnaire, et None autrement. Si le deuxième paramètre n'est pas spécifié (ie. my_dict.pop('key')) et key n'existe pas, un KeyError est élevé.


1744
2018-06-30 20:29



Spécifiquement pour répondre "est-ce qu'il y a une façon d'y parvenir?"

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

...bien toi a 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 le if déclaration, mais peut être effacé avant del est exécuté, auquel cas del va échouer avec un KeyError. Compte tenu de cela, il serait plus sûr de utilisation dict.pop ou quelque chose du genre

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

ce qui, bien sûr, est définitivement ne pas un one-liner.


260
2018-06-30 20:36



Il m'a fallu du temps pour comprendre exactement my_dict.pop("key", None) fait. Donc, je vais ajouter ceci comme une réponse pour sauver d'autres googling temps:

pop (touche [, par défaut])

Si la clé est dans le dictionnaire, retirez-la et renvoyez sa valeur, sinon   retour par défaut. Si la valeur par défaut n'est pas donnée et que la clé n'est pas dans   dictionnaire, une KeyError est levée

Documentation


115
2018-03-04 16:43



Timing 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

25
2017-12-07 12:19



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 assez succincte 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'intercepter des erreurs où vous sautez une valeur qui n'est pas dans le dictionnaire, utilisez lambda dans 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 touche 'e'.


20
2017-09-16 19:17



Utilisation:

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

Autrement:

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

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


14
2017-12-07 05:52



En utilisant le mot-clé "del":

del dict[key]

5
2018-05-02 10:22



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

En utilisant le del mot-clé; c'est presque la même approche que vous 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

Nous pouvons faire comme suit:

Mais il faut garder à l'esprit que, dans ce processus en fait, il ne sera pas effacer toute clé du dictionnaire plutôt que de faire une clé spécifique exclu de ce dictionnaire. En outre, j'ai observé qu'il a retourné un dictionnaire qui n'a pas été commandé le même 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 la coquille, il va exécuter quelque chose comme {'five': 500, 'four': 400, 'three': 300, 'two': 200} - remarquez que ce n'est pas la même chose que myDict. Encore une fois si nous essayons d'imprimer myDict, alors nous pouvons voir toutes les clés y compris celles que nous avons exclues du dictionnaire par cette approche. Cependant, nous pouvons créer un nouveau dictionnaire en affectant l'instruction suivante à une variable:

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

Maintenant, si nous essayons de l'imprimer, cela suivra l'ordre des parents:

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

Ou

En utilisant le pop() méthode.

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-ce, en utilisant pop()méthode, nous pouvons réellement stocker le valeur de la clé si nécessaire, comme ceci:

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

3
2018-05-19 10:09