thiruvenkadam
thiruvenkadam

Reputation: 4250

Delete a dictionary from another dictionary python

If A and B are two dictionaries, using python, is there any way of removing elements from Dictionary A that are in dictionary B?

For example,

parent_dict = {"a" : "aaa", "b" : "bbb", "c" : "ccc", "d" : "ddd", "e": "eee"}
derived_dict = {"a" : "aaa", "d" : "ddd", "e" : "eee"}

Now I need to write a function dict_reduce(dictA, dictB) which deletes all the elements of dictB from dictA.

(i.e.,) dict_reduce(parent_dict, derived_dict) should give {"b" : "bbb", "c" : "ccc"}

My work around with a for loop is:

def dict_reduce(parent_dict, child_dict):
    for key in child_dict.keys():
        del parent_dict[key]
    return parent_dict

reduced_dict = dict_reduce(parent_dict, child_dict)

NOTE:

  1. It will be great if the solution is a one liner or something which do not takes a for loop.
  2. Also we need not to check whether parent dictionary has the key before deleting, since the child dictionary is derived from the parent dictionary. So need not think about keyError.
  3. The parent dictionary is a static dictionary which should not be affected by the method. Instead the returning dictionary should be stored in another reduced dictionary.
  4. There is no need to check whether the child_dict has same key as that of parent_dict. Only the key matters.

Upvotes: 4

Views: 13706

Answers (4)

user3163030
user3163030

Reputation: 343

Using the dictionaries provided in the question:

dict(parent_dict.items() - derived_dict.items())

or

dict(parent_dict.items() ^ derived_dict.items())

Upvotes: 7

DrTyrsa
DrTyrsa

Reputation: 31941

{k: v for k, v in parent_dict.items() if k not in derived_dict}

Upvotes: 12

neurino
neurino

Reputation: 12395

If affect parent_dict is what you want this does the job

map(parent_dict.pop, filter(lambda k: k in derived_dict, parent_dict))

(and also returns duplicate keys)

This variant will also check (if requiered) that also values match:

map(parent_dict.pop, filter(lambda k: k in derived_dict and derived_dict[k] == parent_dict[k], parent_dict))

Upvotes: 0

deStrangis
deStrangis

Reputation: 1930

map(lambda k: del parent_dict[k], child_dict.keys())

Upvotes: 0

Related Questions