比较忽略特定键的字典

geo*_*org 26 python dictionary

如何在考虑某些键的同时测试两个词典是否相等.例如,

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

应该返回True.

UPD:我正在寻找一种高效,快速的解决方案.

UPD2.我最终得到了这段代码,这似乎是最快的:

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)
Run Code Online (Sandbox Code Playgroud)

时间:https://gist.github.com/2651872

eum*_*iro 22

def equal_dicts(d1, d2, ignore_keys):
    d1_filtered = dict((k, v) for k,v in d1.iteritems() if k not in ignore_keys)
    d2_filtered = dict((k, v) for k,v in d2.iteritems() if k not in ignore_keys)
    return d1_filtered == d2_filtered
Run Code Online (Sandbox Code Playgroud)

编辑:这可能更快,更节省内存:

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
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记:在 Python 3+ 中,`iteritems()` 必须替换为 `items()`。 (3认同)

wim*_*wim 13

使用dict理解:

>>> {k: v for k,v in d1.items() if k not in ignore_keys} == \
... {k: v for k,v in d2.items() if k not in ignore_keys}
Run Code Online (Sandbox Code Playgroud)

.viewitems()而是在Python 2上使用.