How can I remove a key from a Python dictionary?

ID : 312

viewed : 89

Tags : pythondictionarydata-structuresunsetpython

Top 5 Answer for How can I remove a key from a Python dictionary?

vote vote

94

To delete a key regardless of whether it is in the dictionary, use the two-argument form of dict.pop():

my_dict.pop('key', None) 

This will return my_dict[key] if key exists in the dictionary, and None otherwise. If the second parameter is not specified (i.e. my_dict.pop('key')) and key does not exist, a KeyError is raised.

To delete a key that is guaranteed to exist, you can also use:

del my_dict['key'] 

This will raise a KeyError if the key is not in the dictionary.

vote vote

89

Specifically to answer "is there a one line way of doing this?"

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

...well, you asked ;-)

You should consider, though, that this way of deleting an object from a dict is not atomic—it is possible that 'key' may be in my_dict during the if statement, but may be deleted before del is executed, in which case del will fail with a KeyError. Given this, it would be safest to either use dict.pop or something along the lines of

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

which, of course, is definitely not a one-liner.

vote vote

78

It took me some time to figure out what exactly my_dict.pop("key", None) is doing. So I'll add this as an answer to save others googling time:

pop(key[, default])

If key is in the dictionary, remove it and return its value, else return default. If default is not given and key is not in the dictionary, a KeyError is raised.

Documentation

vote vote

65

del my_dict[key] is slightly faster than my_dict.pop(key) for removing a key from a dictionary when the key exists

>>> 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 

But when the key doesn't exist if key in my_dict: del my_dict[key] is slightly faster than my_dict.pop(key, None). Both are at least three times faster than del in a try/except statement:

>>> 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 
vote vote

50

If you need to remove a lot of keys from a dictionary in one line of code, I think using map() is quite succinct and Pythonic readable:

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} 

And if you need to catch errors where you pop a value that isn't in the dictionary, use lambda inside map() like this:

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

or in python3, you must use a list comprehension instead:

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

It works. And 'e' did not cause an error, even though myDict did not have an 'e' key.

Top 3 video Explaining How can I remove a key from a Python dictionary?

Related QUESTION?