【问题标题】:How to return the amount of difference from a recursive dictionary check如何从递归字典检查中返回差异量
【发布时间】:2020-10-12 03:47:15
【问题描述】:

我正在检查两个字典中键、值的差异。但是我可以打印差异,但我想将结果保存在一个变量中(是否存在差异,或者有多少差异)。

def findDiff(d1, d2, path="", differences = 0):
    for k in d1:
        if (k not in d2):
            print (path, ":")
            print (k + " as key not in d2", "\n")
            differences += 1
        else:
            if type(d1[k]) is dict:
                if path == "":
                    path = k
                else:
                    path = path + "->" + k
                findDiff(d1[k], d2[k], path, differences)
            else:
                if d1[k] != d2[k]:
                    print (path, ":")
                    print (" - ", k," : ", d1[k])
                    print (" + ", k," : ", d2[k])
                    differences += 1
    return differences

a = findDiff(moot_params, database_params)

print(a)

但是,如果最后一个字典不包含任何差异,这总是会导致 None。

有人知道我如何使用此递归返回值吗?

【问题讨论】:

  • findDiff(d1[k], d2[k], path, differences) 更改为differences += findDiff(d1[k], d2[k], path) 是否有效?
  • 是的!有时解决方案并不那么复杂。感谢您的清新外观
  • 好吧,我会写一个答案来解释为什么该修复有效。
  • 我鼓励您在自己的脑海中澄清findDiff() 的目的:它的目的是返回有关两个字典之间差异的信息(即返回数据);还是要打印有关两个字典之间差异的信息(即打印内容)?编写函数时,选择其中一个,而不是两者都选。而且,真的,唯一明智的选择是第一个(返回数据),因为如果你在那个部分做得很好,几乎总是很容易编写一个不同的函数来获取该信息并以各种方式打印出来。
  • 感谢FMc的建议,对于程序来说只需要获取修改量即可。 (差异),但是如果有差异,打印实际差异以避免手动搜索它是有用的。但我同意,唯一的目的应该是一个标志:是否相等(我可以返回一个布尔值)

标签: python python-3.x dictionary recursion


【解决方案1】:

您必须将findDiff(d1[k], d2[k], path, differences) 更改为differences += findDiff(d1[k], d2[k], path) 的原因(正如我在评论中指出的那样)是因为Python 参数是passed by assignment,并且整数是不可变的。要更改整数,而不是将其传递给函数并在内部进行更改,您应该返回从内部更改了多少(如链接示例所示)。

如果你还不太了解链接和整数不变性,简单来说就是当你修改findDiff(d1[k], d2[k], path, differences)中的differences时,你已经在“外面”的differences不会得到修改的。解决方案是使用+= 显式更改differences,从而提供您想要的递归功能。

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 2022-01-15
    • 2015-06-05
    • 2011-08-19
    • 2021-12-16
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多