intersection, union, difference, symmetric difference for dictionaries

Steven D'Aprano steve+comp.lang.python at pearwood.info
Wed Feb 26 00:10:29 CET 2014


On Tue, 25 Feb 2014 15:03:51 -0600, Tim Chase wrote:

> On 2014-02-25 14:40, Skip Montanaro wrote:
>> What's the correct result of evaluating this expression?
>> 
>> {'A': 1} | {'A': 2}
>> 
>> I can see (at least) two possible "correct" answers.
> 
> I would propose at least four:
> 
>   {'A': 1}   # choose the LHS
>   {'A': 2}   # choose the RHS
>   {'A': (1,2)} # a resulting pair of both 

Should that value be a tuple, a list or a set?


>   set(['A']) # you did set-ops, so you get a set

Option 5: raise an exception if the values are different.

Option 6: "or" the values, so that the LHS value is used only if it is 
truthy, otherwise the RHS value is used. That is:

    {'A': leftdict['A'] or rightdict['A']}


I don't really understand the use-case behind Option 6, but there is a 
recent thread on python-ideas at python.org where somebody proposed that as 
the Obviously One True And Correct behaviour for dict intersection.



> If dicts were to support set ops, the last one would be my preferred
> result.

What, getting a set back?

No, I disagree. If you want a set, it's easy to do:

dicta.keys() | dictb.keys()

(In Python 2, use viewkeys instead.)


gives you a set of the intersection of the keys. The only point of having 
dicts support set-like operations directly is if you get a dict back.

All of these operations are quite simple to write, so personally I would 
recommend people just add their own helper function with the behaviour 
they prefer.


-- 
Steven



More information about the Python-list mailing list