Search code examples
pythondictionary

Compare dictionaries ignoring specific keys


How can I test if two dictionaries are equal while taking some keys out of consideration. For example,

equal_dicts(
    {'foo':1, 'bar':2, 'x':55, 'y': 77 },
    {'foo':1, 'bar':2, 'x':66, 'z': 88 },
    ignore_keys=('x', 'y', 'z')
)

should return True.

UPD: I'm looking for an efficient, fast solution.

UPD2. I ended up with this code, which appears to be the fastest:

def equal_dicts_1(a, b, ignore_keys):
    ka = set(a).difference(ignore_keys)
    kb = set(b).difference(ignore_keys)
    return ka == kb and all(a[k] == b[k] for k in ka)

Timings: https://gist.github.com/2651872


Solution

  • def equal_dicts(d1, d2, ignore_keys):
        d1_filtered = {k:v for k,v in d1.items() if k not in ignore_keys}
        d2_filtered = {k:v for k,v in d2.items() if k not in ignore_keys}
        return d1_filtered == d2_filtered
    

    EDIT: This might be faster and more memory-efficient:

    def equal_dicts(d1, d2, ignore_keys):
        ignored = set(ignore_keys)
        for k1, v1 in d1.iteritems():
            if k1 not in ignored and (k1 not in d2 or d2[k1] != v1):
                return False
        for k2, v2 in d2.iteritems():
            if k2 not in ignored and k2 not in d1:
                return False
        return True