dicthelpers.py
55 lines
| 1.6 KiB
| text/x-python
|
PythonLexer
/ mercurial / dicthelpers.py
Siddharth Agarwal
|
r18820 | # 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. | ||||
Siddharth Agarwal
|
r18847 | 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 | ||||
Siddharth Agarwal
|
r18894 | 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.''' | ||||
Siddharth Agarwal
|
r18820 | res = {} | ||
Siddharth Agarwal
|
r18847 | if d1 is d2: | ||
Siddharth Agarwal
|
r18820 | # same dict, so diff is empty | ||
return res | ||||
for k1, v1 in d1.iteritems(): | ||||
Siddharth Agarwal
|
r18894 | v2 = d2.get(k1, default) | ||
if v1 != v2: | ||||
res[k1] = (v1, v2) | ||||
Siddharth Agarwal
|
r18820 | |||
Siddharth Agarwal
|
r18847 | for k2 in d2: | ||
if k2 not in d1: | ||||
Siddharth Agarwal
|
r18894 | v2 = d2[k2] | ||
if v2 != default: | ||||
res[k2] = (default, v2) | ||||
Siddharth Agarwal
|
r18847 | |||
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) | ||||
Siddharth Agarwal
|
r18820 | if d1 is d2: | ||
return res | ||||
for k2 in d2: | ||||
if k2 not in d1: | ||||
res[k2] = (default, d2[k2]) | ||||
return res | ||||