Réponses:
Pour supprimer une clé, qu'elle se trouve dans le dictionnaire ou non, utilisez la forme à deux arguments de dict.pop()
:
my_dict.pop('key', None)
Cela retournera my_dict[key]
s'il key
existe dans le dictionnaire, et None
sinon. Si le deuxième paramètre n'est pas spécifié (c'est-à-dire. my_dict.pop('key')
) Et key
n'existe pas, a KeyError
est levé.
Pour supprimer une clé dont l'existence est garantie, vous pouvez également utiliser
del my_dict['key']
Cela soulèvera un KeyError
si la clé n'est pas dans le dictionnaire.
pop()
over del
: 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?"
if 'key' in my_dict: del my_dict['key']
... 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 trouve my_dict
pendant l' if
instruction, mais peut être supprimée avant l' del
exécution, auquel cas del
elle échouera avec a KeyError
. Compte tenu de cela, il serait plus sûr d' utiliserdict.pop
soit quelque chose du genre
try:
del my_dict['key']
except KeyError:
pass
qui, bien sûr, n'est certainement pas un vol simple.
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, elle try
est en effet beaucoup plus lente. pop
est assez cohérent mais plus lent que tous mais try
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:
pop(key[, default])
Si la clé est dans le dictionnaire, supprimez-la et retournez sa valeur, sinon retournez par défaut . Si la valeur par défaut n'est pas indiquée et que la clé n'est pas dans le dictionnaire, un
KeyError
est levé.
dict.pop?
en IPython.
del my_dict[key]
est légèrement plus rapide que my_dict.pop(key)
pour supprimer une clé d'un dictionnaire lorsque la clé existe
>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"
>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786
Mais lorsque la clé n'existe pas, if key in my_dict: del my_dict[key]
c'est légèrement plus rapide que my_dict.pop(key, None)
. Les deux sont au moins trois fois plus rapides que del
dans une instruction try
/ except
:
>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
... del d['missing key']
... except KeyError:
... pass
... """
>>> timeit.timeit(try_except, setup=setup)
0.133
pop
en a del
. 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:
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 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:
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 à la place:
[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».
map
et les amis sont maintenant paresseux et renvoient des itérateurs. L'utilisation map
d'effets secondaires est généralement considérée comme une mauvaise pratique; une for ... 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
(et filter
).
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 exemple loop(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:
>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'}
Vous pouvez supprimer par conditions. Aucune erreur s'il key
n'existe pas.
Utilisation du mot clé "del":
del dict[key]
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 -
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, 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
.
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 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, il suivra l'ordre des parents:
print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}
Ou
Utilisation de la 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 que, en utilisant la pop()
méthode, nous pouvons réellement stocker la valeur de la clé si 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
Fourchez cet élément pour référence future, si vous trouvez cela utile.
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:
try:
del dict[key]
except KeyError: pass
Cependant, c'est plus lent que la pop()
méthode, si la clé n'existe pas.
my_dict.pop('key', None)
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:
if 'key' in dict:
del myDict['key']
Mais cette méthode est dangereuse car si elle 'key'
est supprimée entre les deux lignes, un KeyError
sera levé.
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.
test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}
# Printing dictionary before removal
print ("dictionary before performing remove is : " + str(test_dict))
# Using items() + dict comprehension to remove a dict. pair
# removes vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}
# Printing dictionary after removal
print ("dictionary after remove is : " + str(new_dict))
Production:
dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}
cela va changer
my_dict
en place (mutable)
my_dict.pop('key', None)
générer un nouveau dict (immuable)
dic1 = {
"x":1,
"y": 2,
"z": 3
}
def func1(item):
return item[0]!= "x" and item[0] != "y"
print(
dict(
filter(
lambda item: item[0] != "x" and item[0] != "y",
dic1.items()
)
)
)