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. -- http://mail.python.org/mailman/listinfo/python-list