Lors de la suppression d'une clé d'un dictionnaire, j'utilise:
if 'key' in my_dict:
del my_dict['key']
Y a-t-il une façon unique de procéder?
Lors de la suppression d'une clé d'un dictionnaire, j'utilise:
if 'key' in my_dict:
del my_dict['key']
Y a-t-il une façon unique de procéder?
Réponses:
Pour supprimer une clé, qu'elle se trouve dans le dictionnaire ou non, utilisez la forme à deux arguments de
dict.pop()
:Cela retournera
my_dict[key]
s'ilkey
existe dans le dictionnaire, etNone
sinon. Si le deuxième paramètre n'est pas spécifié (c'est-à-dire.my_dict.pop('key')
) Etkey
n'existe pas, aKeyError
est levé.Pour supprimer une clé dont l'existence est garantie, vous pouvez également utiliser
Cela soulèvera un
KeyError
si la clé n'est pas dans le dictionnaire.la source
pop()
overdel
: il renvoie la valeur de cette clé. De cette façon, vous pouvez obtenir et supprimer une entrée d'un dict dans une seule ligne de code.try
/except
si la clé n'existe pas. Vous pourriez trouver l'un ou l'autre plus facile à lire, ce qui est bien. Les deux sont en Python idiomatique, alors choisissez ce que vous préférez. Mais prétendre que cette réponse est plus complexe ou inefficace n'a tout simplement aucun sens.self
, il serait donc plutôt surprenant que celle-ci le fasse.Spécifiquement pour répondre "y a-t-il une façon de faire cela sur une ligne?"
... eh bien, vous avez demandé ;-)
Vous devez considérer, cependant, que cette façon de supprimer un objet de a
dict
n'est pas atomique - il est possible qu'elle'key'
se trouvemy_dict
pendant l'if
instruction, mais peut être supprimée avant l'del
exécution, auquel casdel
elle échouera avec aKeyError
. Compte tenu de cela, il serait plus sûr d' utiliserdict.pop
soit quelque chose du genrequi, bien sûr, n'est certainement pas un vol simple.
la source
pop
c'est définitivement plus concis, bien qu'il y ait un avantage clé à le faire de cette façon: c'est immédiatement clair ce qu'il fait.try/except
déclaration est plus chère. La levée d'une exception est lente.try
est légèrement plus rapide, mais si ce n'est pas le cas, elletry
est en effet beaucoup plus lente.pop
est assez cohérent mais plus lent que tous maistry
avec une clé non présente. Voir gist.github.com/zigg/6280653 . En fin de compte, cela dépend de la fréquence à laquelle vous vous attendez à ce que la clé soit réellement dans le dictionnaire, et si vous avez besoin ou non d'atomicité - et, bien sûr, si vous vous lancez dans une optimisation prématurée;)if 'key' in mydict: #then del...
. J'avais besoin de retirer une clé / val d'un dict pour analyser correctement, pop n'était pas une solution parfaite.Il m'a fallu un certain temps pour comprendre ce qui se passe exactement
my_dict.pop("key", None)
. Je vais donc ajouter ceci comme réponse pour gagner du temps sur Google:Documentation
la source
dict.pop?
en IPython.del my_dict[key]
est légèrement plus rapide quemy_dict.pop(key)
pour supprimer une clé d'un dictionnaire lorsque la clé existeMais lorsque la clé n'existe pas,
if key in my_dict: del my_dict[key]
c'est légèrement plus rapide quemy_dict.pop(key, None)
. Les deux sont au moins trois fois plus rapides quedel
dans une instructiontry
/except
:la source
pop
en adel
. La création du dictionnaire supprimera complètement les éléments qu'il contient.del
et àpop
partir du premier ensemble de temporisations ci-dessus)Si vous devez supprimer un grand nombre de clés d'un dictionnaire sur une seule ligne de code, je pense que l'utilisation de map () est assez succincte et lisible en Pythonic:
Et si vous avez besoin de détecter des erreurs lorsque vous entrez une valeur qui n'est pas dans le dictionnaire, utilisez lambda à l'intérieur de map () comme ceci:
ou dans
python3
, vous devez utiliser une liste de compréhension à la place:Ça marche. Et «e» n'a pas causé d'erreur, même si myDict n'avait pas de clé «e».
la source
map
et les amis sont maintenant paresseux et renvoient des itérateurs. L'utilisationmap
d'effets secondaires est généralement considérée comme une mauvaise pratique; unefor ... in
boucle standard serait mieux. Voir Vues et itérateurs au lieu de listes pour plus d'informations.[myDict.pop(i, None) for i in ['a', 'c']]
, car elles offrent une alternative générale àmap
(etfilter
).for ... in
boucle régulière .map()
, qui est souvent utilisée pour ses effets secondaires. L'alternative recommandée en Python est la compréhension de la liste, qui à mon avis est encore assez lisible et cognitivement légère comme une ligne (voir la question). Utilisées uniquement pour leurs effets secondaires, les deux constructions aboutissent en effet à une liste inutile, qui peut être inefficace. En ce qui concerne Python3, je ne connais pas de fonction intégrée qui puisse itérer en toute sécurité et élégance à travers une expression de générateur, sans sous-produit coûteux, par exempleloop(d.pop(k) for k in ['a', 'b'])
.Vous pouvez utiliser une compréhension de dictionnaire pour créer un nouveau dictionnaire avec cette clé supprimée:
Vous pouvez supprimer par conditions. Aucune erreur s'il
key
n'existe pas.la source
Utilisation du mot clé "del":
la source
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 l'avez fait -Ou
Nous pouvons faire comme suit:
Mais il faut garder à l'esprit que, dans ce processus, il ne supprimera aucune clé du dictionnaire plutôt que d' exclure une clé spécifique de ce dictionnaire. De plus, j'ai observé qu'il renvoyait un dictionnaire qui n'était pas commandé de la même manière que
myDict
.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 quemyDict
. Encore une fois, si nous essayons d'imprimermyDict
, 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:Maintenant, si nous essayons de l'imprimer, il suivra l'ordre des parents:
Ou
Utilisation de la
pop()
méthode.La différence entre
del
etpop
est que, en utilisant lapop()
méthode, nous pouvons réellement stocker la valeur de la clé si nécessaire, comme suit:Fourchez cet élément pour référence future, si vous trouvez cela utile.
la source
if myDict.get('one')
pour vérifier si une clé est présente! Il échoue si myDict ['one'] a une valeur de falsey. De plus, les dict n'ont pas d'ordre inhérent, il n'est donc pas logique de le mentionner.Vous pouvez utiliser la gestion des exceptions si vous voulez être très bavard:
Cependant, c'est plus lent que la
pop()
méthode, si la clé n'existe pas.Cela n'aura pas d'importance pour quelques clés, mais si vous faites cela à plusieurs reprises, alors la dernière méthode est une meilleure mise.
L'approche la plus rapide est la suivante:
Mais cette méthode est dangereuse car si elle
'key'
est supprimée entre les deux lignes, unKeyError
sera levé.la source
Je préfère la version immuable
la source
Une autre méthode consiste à utiliser items () + compréhension du dict
items () couplé à la compréhension de dict peut également nous aider à réaliser la tâche de suppression de paire clé-valeur, mais il présente l'inconvénient de ne pas être une technique de dict en place. En fait, un nouveau dict si créé à l'exception de la clé que nous ne souhaitons pas inclure.
Production:
la source
Filtre unique sur clé
Plusieurs filtres sur les touches
la source