Remove key from dictionary in Python returning new dictionary

PythonMethodsDictionary

Python Problem Overview


I have a dictionary

d = {'a':1, 'b':2, 'c':3}

I need to remove a key, say c and return the dictionary without that key in one function call

{'a':1, 'b':2}

d.pop('c') will return the key value - 3 - instead of the dictionary.

I am going to need one function solution if it exists, as this will go into comprehensions

Python Solutions


Solution 1 - Python

How about this:

{i:d[i] for i in d if i!='c'}

It's called Dictionary Comprehensions and it's available since Python 2.7.

or if you are using Python older than 2.7:

dict((i,d[i]) for i in d if i!='c')

Solution 2 - Python

Why not roll your own? This will likely be faster than creating a new one using dictionary comprehensions:

def without(d, key):
    new_d = d.copy()
    new_d.pop(key)
    return new_d

Solution 3 - Python

If you need an expression that does this (so you can use it in a lambda or comprehension) then you can use this little hack trick: create a tuple with the dictionary and the popped element, and then get the original item back out of the tuple:

(foo, foo.pop(x))[0]

For example:

ds = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}]
[(d, d.pop('c'))[0] for d in ds]
assert ds == [{'a': 1, 'b': 2}, {'a': 4, 'b': 5}]

Note that this actually modifies the original dictionary, so despite being a comprehension, it's not purely functional.

Solution 4 - Python

When you invoke pop the original dictionary is modified in place.

You can return that one from your function.

>>> a = {'foo': 1, 'bar': 2}
>>> a.pop('foo')
1
>>> a
{'bar': 2}

Solution 5 - Python

this will work,

(lambda dict_,key_:dict_.pop(key_,True) and dict_)({1:1},1)

EDIT this will drop the key if exist in the dictionary and will return the dictionary without the key,value pair

in python there are functions that alter an object in place, and returns a value instead of the altered object, {}.pop function is an example.

we can use a lambda function as in the example, or more generic below (lambda func:obj:(func(obj) and False) or obj) to alter this behavior, and get a the expected behavior.

Solution 6 - Python

solution from me

item = dict({"A": 1, "B": 3, "C": 4})
print(item)
{'A': 1, 'B': 3, 'C': 4}

new_dict = (lambda d: d.pop('C') and d)(item)
print(new_dict)
{'A': 1, 'B': 3}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionXeosView Question on Stackoverflow
Solution 1 - Pythonjh314View Answer on Stackoverflow
Solution 2 - PythonGustav LarssonView Answer on Stackoverflow
Solution 3 - Pythonz0rView Answer on Stackoverflow
Solution 4 - PythonFelix YuanView Answer on Stackoverflow
Solution 5 - PythonsinaiyView Answer on Stackoverflow
Solution 6 - PythonSamsul Hadi 夏豪迪View Answer on Stackoverflow