字典递归比较程序

2023-12-14

我创建了一个程序来比较两个 python 字典并输出两者的差异。它适用于深度为 2 或更小的字典。我应该怎么做才能处理更深度的字典以及嵌套的字典?

我遇到的另一个问题是,当我通过 get_json() 函数传递 json 数组时,它会作为列表返回。并且该程序正在使用列表而不是字典来出错。我应该如何解决这个问题?

我的程序:

#!/usr/bin/env python2

import json

def get_json():
    file_name = raw_input("Enter name of JSON File: ")
    with open(file_name) as json_file:
        json_data = json.load(json_file)
        return json_data

def print_diff(json1, json2):
    for n in json1:
        if n not in json2:
            print('-   "' + str(n) + '":')
    for n in json2:
        if n not in json1:
            print('+   "' + str(n) + '":')
            continue
        if json2[n] != json1[n]:
            if type(json2[n]) not in (dict, list):
                print('-   "' + str(n) + '" : "' + str(json1[n]))
                print('+   "' + str(n) + '" : "' + str(json2[n]))
            else:
                if type(json2[n]) == dict:
                    print_diff(json1[n], json2[n])
                    continue
    return


def main():
    file1 = get_json()
    print(type(file1))
    file2 = get_json()
    print(type(file2))
    print_diff(file1, file2)

if __name__ == "__main__":
    main()

字典 1 的示例:

{
    "widget": {
        "debug": "on",
        "window": {
            "title": "Sample Konfabulator Widget",
            "name": "main_window",
            "width": 500,
            "height": 500
        },
        "image": {
            "src": "Images/Sun.png",
            "name": "sun1",
            "hOffset": 250,
            "vOffset": 250,
            "alignment": "center"
        },
        "text": {
            "data": "Click Here",
            "size": 36,
            "style": "bold",
            "name": "text1",
            "hOffset": 250,
            "vOffset": 100,
            "alignment": "center",
            "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
        }
    }
}

字典 2 的示例:

{
    "widget": {
        "debug": "on",
        "window": {
            "title": "Sample Konfabulator Widget",
            "name": "main_window",
            "width": 500,
            "height": 500
        },
        "image": {
            "src": "Images/Sun.png",
            "name": "sun2",
            "hOffset": 100,
            "vOffset": 100,
            "alignment": "center"
        },
        "text": {
            "data": "Click Here",
            "size": 36,
            "style": "bold",
            "name": "text1",
            "hOffset": 250,
            "vOffset": 100,
            "alignment": "center",
            "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
        }
    }
}

示例输出:

Enter name of JSON File: JSON1.json
<type 'dict'>
Enter name of JSON File: JSON2.json
<type 'dict'>
-   "vOffset" : "250
+   "vOffset" : "100
-   "name" : "sun1
+   "name" : "sun2
-   "hOffset" : "250
+   "hOffset" : "100

我编写了以下代码,它可以比较两个不同深度的字典并将差异打印到控制台输出。请注意,如果在第一个字典中找到了该键,而在第二个字典中没有找到该键,则它只会打印未找到的键(不会在躺着的树下打印)。我希望这是所期望的。此代码适用于单向比较,因此您需要进行两次调用才能以其他方式比较字典。

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

print "comparing s1 to s2:"
print findDiff(s1,s2)
print "comparing s2 to s1:"
print findDiff(s2,s1)

Output::

comparing s1 to s2:
widget->text :
data as key not in d2 
widget->text->window->image :
 -  vOffset  :  250
 +  vOffset  :  100
widget->text->window->image :
 -  name  :  sun1
 +  name  :  sun2
widget->text->window->image :
 -  hOffset  :  250
 +  hOffset  :  100
None
comparing s2 to s1:
widget->text->window->image :
 -  vOffset  :  100
 +  vOffset  :  250
widget->text->window->image :
 -  name  :  sun2
 +  name  :  sun1
widget->text->window->image :
 -  hOffset  :  100
 +  hOffset  :  250
None

请注意,在您的问题中,您没有考虑 key 是否存在差异,不会打印 key 的路径。我正在我的代码中打印它。我已从小部件->文本中删除了数据元素以进行测试。所以,请忽略这个控制台输出

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字典递归比较程序 的相关文章

随机推荐

  • PHPMailer 收件人地址上的字符 ñ

    当我尝试将电子邮件发送到包含字母 的收件人地址时 我在 phpmailer 上收到下一个错误 例如 致命错误 未捕获异常 phpmailerException 并带有消息 无效地址 lauro mu 电子邮件受保护 我知道它说这是一个无效地
  • 我可以通过任何方式检测驱动程序签名策略状态吗?

    我有一个修改过的驱动程序 并且必须在禁用驱动程序签名时安装 因此我想检测此状态以提醒用户重新启动到安全模式 我试过这个命令 Bcdedit exe set TESTSIGNING OFF 但是失败并提示 设置元素数据时发生错误 该值受安全启
  • Django 和 HTML 数组

    我有一个包含以下输入的表单
  • Pig、Cassandra 和 DataStax 拆分控制

    我一直在使用 Pig 和我的 Cassandra 数据来完成各种令人惊奇的分组壮举 而这些壮举几乎不可能用命令式的方式编写 我正在使用 DataStax 的 Hadoop 和 Cassandra 集成 我不得不说它令人印象深刻 向那些家伙致
  • Ajillion PHP-MySQLi-数据库类更新命令

    使用 Ajillion 制作的 MySQLi 类 https github com ajillion PHP MySQLi Database Class 我想执行以下命令 command UPDATE sessions SET active
  • 如何从 Mayavi GUI 加载 CSV 文件?

    我知道如何将 CSV 读入 numpy 并通过 Python 脚本执行此操作 这对于我的用例来说已经足够了 但由于它有一个具有数据加载功能的 GUI 我希望它能够适用于这种通用数据格式 所以我尝试进入菜单 File 加载数据 打开文件 但是
  • 使用 Func<> 提高代码可读性的机会

    今天我终于 得到 了Func lt gt delegate 并了解了如何使用它来使我的一些可读性较差的 LINQ 查询 希望如此 更具可读性 这是一个简单的代码示例 以 非常 简单的示例说明了上述内容 List
  • T-SQL 中的“WHERE IN”[重复]

    这个问题在这里已经有答案了 可能的重复 参数化 SQL IN 子句 是否可以使用查询参数来填充IN关键字 您好 我在 SQL 查询中使用 WHERE IN 因为用户可能需要输入多个 id 来显示 的记录 以逗号分隔 我现在有这个 WHERE
  • 骨干模型保存

    我正在使用 Rails 并学习 Backbone 请帮帮我 有什么方法可以在保存时设置正确的模型吗 例如 当我创建带有一些参数的新用户并尝试将其保存到数据库中时 在服务器端 我没有将用户作为对象 而是将用户字段保存在参数中 保存用户的唯一方
  • 如何在java中使用fiddler捕获https

    我正在 Eclipse IDE 中运行以下 java 程序 import java net import java io public class HH public static void main String args throws
  • 默认整数值是什么?

    我在某处读到默认浮点值 例如1 2 are double not float 那么默认整数值是多少6 他们是short int or long 以 10 为基数给出的整数文字类型是以下列表中其值可以容纳的第一个类型 int long int
  • Spidermonkey 上的垃圾收集器问题...JS_AnchorPtr()?

    我推出了自己的 javascript 服务器端语言 称为 bondi 最近刚刚升级到新的蜘蛛猴 现在JS进入本地根和离开本地根的功能从1 8 5 api中消失 无用了 只使用锚点指针就足够了 JS AnchorPtr varname 在函数
  • Jasper Reports 中的子报表

    我有两个表格要打印在同一页上 这些表的数据将从自定义数据源的地图中提供 我需要实施它 我用谷歌搜索来实现这个任务 当时我遇到了子报告的概念 但我没有得到太多关于如何实现子报告的信息 我知道如何创建子报告 但我不知道如何使用自定义数据源填充子
  • jQuery UI 滑块 -> 支持鼠标滚轮?

    你可能已经知道我是 jQuery 的新手 所以不属于这个主题的代码改进仍然是非常允许的 这是我的 HTML 代码 div style display inline block width 120px div Bananas br div d
  • jasypt-spring-boot-1.17:属性解密失败,请确保加密/解密密码匹配

    我有 jasypt spring boot 1 17 带有 spring 版本 4 2 5 RELEASE 和 spring Boot 版本 1 5 3 RELEASE 我正在使用该网站的第一种方法 https github com uli
  • JavaScript 中同一行的多个比较/赋值运算符

    function test input var value input 1 在上面 函数内部的代码行在做什么以及它是如何工作的 首先是进行比较input 1 然后分配其结果 这将是true or false 变量value The is a
  • 如何自定义 HTML5 日期选择器

    我试图了解如何以特定方式自定义 HTML5 日期选择器 特别是格式类似于 日历图标 8 月 31 日 星期二右侧插入符号将打开日期选择器 经过一些初步搜索后 我找到了这些用于自定义日期输入文本框的伪元素 webkit datetime ed
  • c++ - FreeImage+OpenCV - 16 位图像扭曲

    我正在尝试加载图像 因为我必须对其应用算法 如果我加载每通道 8 位图像 则没有问题 但如果我加载 16bpc 图像 则会 毁掉 不幸的是 由于我没有足够的声誉 我无法上传图像 这些是它们的链接 源和 8bpc 处理结果 http post
  • 了解为什么 onCreateOptionsMenu 不显示菜单

    我正在阅读 Android For Dummies 一个例子使用了 onCreateOptionsMenu 我添加了一条日志消息 Override public boolean onCreateOptionsMenu Menu menu s
  • 字典递归比较程序

    我创建了一个程序来比较两个 python 字典并输出两者的差异 它适用于深度为 2 或更小的字典 我应该怎么做才能处理更深度的字典以及嵌套的字典 我遇到的另一个问题是 当我通过 get json 函数传递 json 数组时 它会作为列表返回