What's the cleanest way to compare 2 dictionary?

Paddy paddy3118 at netscape.net
Fri Aug 11 16:41:38 EDT 2006


I have gone the whole hog and got something thats run-able:

========dict_diff.py=============================

from pprint import pprint as pp

a = {1:{'1':'1'}, 2:{'2':'2'}, 3:dict("AA BB CC".split()), 4:{'4':'4'}}
b = {             2:{'2':'2'}, 3:dict("BB CD EE".split()), 5:{'5':'5'}}
def record_comparator(a,b, check_equal):
    keya=set(a.keys())
    keyb=set(b.keys())
    a_xclusive = keya - keyb
    b_xclusive = keyb - keya
    _common = keya & keyb
    common_eq = set(k for k in _common if check_equal(a[k],b[k]))
    common_neq = _common - common_eq
    return {"A excl keys":a_xclusive, "B excl keys":b_xclusive,
            "Common & eq":common_eq, "Common keys neq
values":common_neq}

comp_result = record_comparator(a,b, dict.__eq__)

# Further dataon common keys, neq values
common_neq = comp_result["Common keys neq values"]
common_neq = [ (key, record_comparator(a[key],b[key], str.__eq__))
               for key in common_neq ]
comp_result["Common keys neq values"] = common_neq

print "\na =",; pp(a)
print "\nb =",; pp(b)
print "\ncomp_result = " ; pp(comp_result)

==========================================

When run it gives:

a ={1: {'1': '1'},
 2: {'2': '2'},
 3: {'A': 'A', 'C': 'C', 'B': 'B'},
 4: {'4': '4'}}

b ={2: {'2': '2'}, 3: {'C': 'D', 'B': 'B', 'E': 'E'}, 5: {'5': '5'}}

comp_result =
{'A excl keys': set([1, 4]),
 'B excl keys': set([5]),
 'Common & eq': set([2]),
 'Common keys neq values': [(3,
                             {'A excl keys': set(['A']),
                              'B excl keys': set(['E']),
                              'Common & eq': set(['B']),
                              'Common keys neq values': set(['C'])})]}


- Paddy.




More information about the Python-list mailing list