字典的差异

dbd*_*407 8 python dictionary

我试图弄清楚dict中的差异,无论是添加还是删除某些内容,还是从中删除.

以下是添加值的情况:

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

difference = True, {2: 2} # True = Added
Run Code Online (Sandbox Code Playgroud)

以下是删除值的情况:

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

difference = False, {2: 16} # False = Removed
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何收集差异.有人会碰巧知道如何实现这样的结果吗?

额外信息(不知道你是否需要这个):

  • 这也适用于原始和新的0和1.
  • 1和2不能同时激活.如果有值,则另一个为假.

sof*_*lay 6

正如我在另一个问题中解释的那样,PyPI上有一个用于此任务的,它是datadiff库.它易于使用,您可以使用输出来执行您必须执行的操作.


AJ.*_*AJ. 2

下面是一个函数的链接,该函数可以生成两个字典的“差异”,后面是附加注释/代码示例:

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