比较字典忽略特定键

2024-04-29 07:41:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我怎样才能在不考虑某些键的情况下测试两个词典是否相等。例如

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

应该是真的。

我在寻找一个高效、快速的解决方案。

升级版2。最后我得到了这个代码,它看起来是最快的:

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)

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


Tags: 代码kbfoodefbar情况equalkeys
3条回答

使用听写理解:

>>> {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}

在Python 2上使用.viewitems()

非常非常粗略地说,您可以删除任何忽略的键并比较这些字典:

def equal_dicts(d1, d2, ignore_keys=()):
    d1_, d2_ = d1.copy(), d2.copy()
    for k in ignore_keys:
        try:
            del d1_[k]
        except KeyError: 
            pass
        try:
            del d2_[k]
        except KeyError: 
            pass

    return d1_ == d2_

(注意,这里不需要深度复制,只需要避免修改d1d2。)

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

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

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

相关问题 更多 >