di中的差异

2024-04-27 14:32:31 发布

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

我想弄清楚听写的区别,是添加了什么还是删除了什么。

下面是一个增值的例子:

original = {0: None, 1: False, 2: [16]}
new = {0: None, 1: False, 2: [2, 16]}

difference = True, {2: 2} # True = Added

这里是一个值被移除的情况:

original = {0: None, 1: False, 2: [16, 64]}
new = {0: None, 1: False, 2: [64]}

difference = False, {2: 16} # False = Removed

问题是,我不知道如何得到差异。有谁会碰巧知道如何取得这样的结果吗?

额外信息(不知道您是否需要此信息):

  • 这也适用于原始和新的0和1。
  • 1和2不能同时处于活动状态。如果一个有值,另一个是假的。

Tags: none信息falsetrueaddednew情况差异
3条回答

正如我在other question中所解释的,PyPI上有一个用于此任务的库,即datadiff library。它很容易使用,你可以使用输出来做你必须做的事情。

下面是指向一个函数的链接,该函数可以生成两个字典的“diff”,然后是其他注释/代码示例:

http://code.activestate.com/recipes/576644-diff-two-dictionaries/

包括以下代码:

KEYNOTFOUND = '<KEYNOTFOUND>'       # KeyNotFound for dictDiff

def dict_diff(first, second):
    """ Return a dict of keys that differ with another config object.  If a value is
        not found in one fo the configs, it will be represented by KEYNOTFOUND.
        @param first:   Fist dictionary to diff.
        @param second:  Second dicationary to diff.
        @return diff:   Dict of Key => (first.val, second.val)
    """
    diff = {}
    # Check all keys in first dict
    for key in first.keys():
        if (not second.has_key(key)):
            diff[key] = (first[key], KEYNOTFOUND)
        elif (first[key] != second[key]):
            diff[key] = (first[key], second[key])
    # Check all keys in second dict to find missing
    for key in second.keys():
        if (not first.has_key(key)):
            diff[key] = (KEYNOTFOUND, second[key])
    return diff

我觉得这很有可读性:

def dict_diff(left, right):
    diff = dict()
    diff['left_only'] = set(left) - set(right)
    diff['right_only'] = set(right) - set(left)
    diff['different'] = {k for k in set(left) & set(right) if left[k]!=right[k]}
    return diff

>>> d1 = dict(a=1, b=20, c=30, e=50)
>>> d2 = dict(a=1, b=200, d=400, e=500)
>>> dict_diff(d1, d2)
{'different': {'b', 'e'}, 'left_only': {'c'}, 'right_only': {'d'}}

相关问题 更多 >