web-dev-qa-db-fra.com

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 un moyen de faire cela en une ligne?

1439
Tony

Utilisez dict.pop() :

my_dict.pop('key', None)

Cela retournera my_dict[key] si key existe dans le dictionnaire et None sinon. Si le deuxième paramètre n'est pas spécifié (c.-à-d. my_dict.pop('key')) et que key n'existe pas, un KeyError est déclenché.

2354
Sven Marnach

Spécifiquement pour répondre "y a-t-il une manière d'une ligne de faire ceci?"

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

... eh bien, vous avez demandé ;-)

Vous devez cependant considérer que cette manière de supprimer un objet d'un dict est non atomique - il est possible que 'key' soit dans myDict pendant le Déclaration if, mais peut être supprimée avant que del ne soit exécuté, auquel cas del échouera avec un KeyError. Compte tenu de cela, il serait plus sûr de choisir tilisez dict.pop ou quelque chose du genre:

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

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

323
zigg

Il m'a fallu du temps pour comprendre ce que fait exactement my_dict.pop("key", None). Je vais donc ajouter ceci comme une réponse pour économiser le temps de googler d'autres:

pop (touche [ défaut])

Si la clé est dans le dictionnaire, supprimez-la et renvoyez sa valeur, sinon renvoyez la valeur par défaut. Si default n'est pas indiqué et que key ne figure pas dans le dictionnaire, une erreur KeyError est déclenchée.

Documentation

130
Akavall

Calendrier des trois solutions décrites ci-dessus.

del est la méthode la plus rapide pour supprimer une clé d'un dictionnaire Python

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

Dictionnaire plus grand:

>>> 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
40
Peter Smit

Si vous devez supprimer beaucoup de clés d'un dictionnaire dans une ligne de code, je pense que l'utilisation de map () est assez succincte et lisible en Pythonic:

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 devez détecter les erreurs lorsque vous insérez une valeur ne figurant 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}

ou dans python3, vous devez utiliser une liste de compréhension:

[myDict.pop(x, None) for x in ['a', 'c', 'e']]

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

36
Marc Maxmeister

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.

17
Shameem

Utilisation du mot clé "del":

del dict[key]
13
Sarthak Gupta

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

Utilisation du mot clé del; c'est presque la même approche que vous avez fait cependant -

 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}

Or

Nous pouvons faire comme suit:

Mais il ne faut pas oublier que, dans ce processus, il ne supprimeradeleteaucune clé du dictionnaire au lieu de créer une clé spécifiqueexcludedà partir 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, nous pourrons 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 assignant l'instruction suivante à une variable:

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

Maintenant, si nous essayons de l’imprimer, alors cela suivra la commande parente:

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

Or

Utilisation de 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 touchesi nécessaire, comme suit:

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

Fork this Gist pour référence future, si cela vous semble utile.

7
iNet

Vous pouvez utiliser la gestion des exceptions si vous voulez être très prolixe:

try: 
    del dict[key]

except KeyError: pass

Ceci est toutefois plus lent que la méthode pop(), si la clé n'existe pas.

my_dict.pop('key', None)

Cela n’aura pas d’importance pour quelques touches, mais si vous faites cela à plusieurs reprises, alors la dernière méthode est un meilleur pari.

L'approche la plus rapide est la suivante:

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

Mais cette méthode est dangereuse car si 'key' est supprimé entre les deux lignes, une KeyError sera levée.

2
Alec Alameddine

Je préfère la version immuable

foo = {
    1:1,
    2:2,
    3:3
}
removeKeys = [1,2]
def woKeys(dct, keyIter):
    return {
        k:v
        for k,v in dct.items() if k not in keyIter
    }

>>> print(woKeys(foo, removeKeys))
{3: 3}
>>> print(foo)
{1: 1, 2: 2, 3: 3}
1
CervEd