You get a KeyError for 4 as ^
looks for the symmetric difference which means keys unique to either, the keys are not in both. You also don't need to create sets, you can use the view object returned from calling .keys
d1 = {1: 30, 2: 20, 3: 30, 5: 80}
d2 = {1: 40, 2: 50, 3: 60, 4: 70, 6: 90}
# d1.keys() ^ d2 -> {4, 5, 6}, 4, 6 unique to d2, 5 unique to d1.
symm = {k: d1.get(k, d2.get(k)) for k in d1.keys() ^ d2}
inter = {k: d2[k] + d1[k] for k in d1.keys() & d2}
d1.get(k, d2.get(k))
works for the symmetric difference as it catches when we get a unique key from d2
.
The code for python2 is slightly different, you would need to replace .keys
with .viewkeys
to get a view object:
{k: d1.get(k, d2.get(k)) for k in d1.viewkeys() ^ d2}
{k: d2[k] + d1[k] for k in d1.viewkeys() & d2}
To get the just the difference between two sets i.e what is in a but not in b, you need -
:
In [1]: d1 = {1: 30, 2: 20, 3: 30, 5: 80}
In [2]: d2 = {1: 40, 2: 50, 3: 60, 4: 70, 6: 90}
In [3]: {k: d2[k] for k in d2.keys() - d1}
Out[3]: {4: 70, 6: 90}
In [4]: {k: d1[k] for k in d1.keys() - d2}
Out[4]: {5: 80}
In [5]: d2.keys() - d1 # in d2 not in d1
Out[5]: {4, 6}
In [6]: d1.keys() - d2 # in d1 not in d2
Out[6]: {5}
In [7]: d1.keys() ^ d2 # unique to either
Out[7]: {4, 5, 6}
The symmetric difference is like doing the union of the differences:
In [12]: d1.keys() - d2 | d2.keys() - d1
Out[12]: {4, 5, 6}
All the operators are discussed in the python docs, also the wiki page on Set_(mathematics) gives you a good overview.