intersection, union, difference, symmetric difference for dictionaries

Steven D'Aprano steve+comp.lang.python at pearwood.info
Tue Feb 25 18:10:29 EST 2014


On 2014年2月25日 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

AltStyle によって変換されたページ (->オリジナル) /