How to intersect dictionaries? [duplicate]
Solution 1:
You could simplify this, using actual set
intersection. This retains only shared items (key and value the same):
def intersect(a, b):
return dict(a.items() & b.items())
If your dict
params have non-hashable values, you can go for a dict
comprehension along the following lines:
def intersect(a, b):
return {k: a[k] for k in a if b.get(k, not a[k]) == a[k]}
And you can fix your original approach like so:
def intersect(a, b):
d = {}
for i in a:
if i in b and a[i] == b[i]:
d[i] = a[i]
return d
Solution 2:
Here is a version of the intersect
function, that intersects the keys and uses the values of the first dictionary, that means in case of different values, this function is biased towards the value in the first dictionary:
def intersect(a, b):
return {k: a[k] for k in a.keys() & b.keys()}
This works because, the dict_keys
view objects returned by dict.keys()
(since Python 3) are sets (i.e. implement collections.abc.Set
).
If you want to customize, which value will be used, we can use a function, that takes both values:
def intersect(a, b, select=lambda a, b: a):
return {k: select(a[k], b[k]) for k in a.keys() & b.keys()}
Instead of returning one of the values, we could then also e.g. add the values:
>>> intersect({'a': 4, 'b': 3}, {'a': 5}, lambda a, b: a + b)
{'a': 9}