| # dicthelpers.py - helper routines for Python dicts |
| # |
| # Copyright 2013 Facebook |
| # |
| # This software may be used and distributed according to the terms of the |
| # GNU General Public License version 2 or any later version. |
| |
| def diff(d1, d2, default=None): |
| '''Return all key-value pairs that are different between d1 and d2. |
| |
| This includes keys that are present in one dict but not the other, and |
| keys whose values are different. The return value is a dict with values |
| being pairs of values from d1 and d2 respectively, and missing values |
| treated as default, so if a value is missing from one dict and the same as |
| default in the other, it will not be returned.''' |
| res = {} |
| if d1 is d2: |
| # same dict, so diff is empty |
| return res |
| |
| for k1, v1 in d1.iteritems(): |
| v2 = d2.get(k1, default) |
| if v1 != v2: |
| res[k1] = (v1, v2) |
| |
| for k2 in d2: |
| if k2 not in d1: |
| v2 = d2[k2] |
| if v2 != default: |
| res[k2] = (default, v2) |
| |
| return res |
| |
| def join(d1, d2, default=None): |
| '''Return all key-value pairs from both d1 and d2. |
| |
| This is akin to an outer join in relational algebra. The return value is a |
| dict with values being pairs of values from d1 and d2 respectively, and |
| missing values represented as default.''' |
| res = {} |
| |
| for k1, v1 in d1.iteritems(): |
| if k1 in d2: |
| res[k1] = (v1, d2[k1]) |
| else: |
| res[k1] = (v1, default) |
| |
| if d1 is d2: |
| return res |
| |
| for k2 in d2: |
| if k2 not in d1: |
| res[k2] = (default, d2[k2]) |
| |
| return res |