计算两个Python字典中包含的键的差异

2023-12-12

假设我有两个 Python 字典 -dictA and dictB。我需要查明是否存在任何密钥dictB但不在dictA。最快的方法是什么?

我应该将字典键转换为一组然后继续吗?

有兴趣了解您的想法...


感谢您的回复。

抱歉没有正确陈述我的问题。 我的情况是这样的 - 我有一个dictA这可以是相同的dictB或者与以下相比可能缺少一些键dictB否则某些键的值可能不同,必须将其设置为dictA键的值。

问题是字典没有标准,并且可以具有可以是字典的字典的值。

Say

dictA={'key1':a, 'key2':b, 'key3':{'key11':cc, 'key12':dd}, 'key4':{'key111':{....}}}
dictB={'key1':a, 'key2:':newb, 'key3':{'key11':cc, 'key12':newdd, 'key13':ee}.......

因此,“key2”值必须重置为新值,并且“key13”必须添加到字典中。 键值没有固定的格式。它可以是一个简单的值或一个字典或一个字典的字典。


您可以对按键使用设置操作:

diff = set(dictb.keys()) - set(dicta.keys())

这里有一个类来查找所有可能性:添加了什么、删除了什么、哪些键值对相同​​、哪些键值对发生了更改。

class DictDiffer(object):
    """
    Calculate the difference between two dictionaries as:
    (1) items added
    (2) items removed
    (3) keys same in both but changed values
    (4) keys same in both and unchanged values
    """
    def __init__(self, current_dict, past_dict):
        self.current_dict, self.past_dict = current_dict, past_dict
        self.set_current, self.set_past = set(current_dict.keys()), set(past_dict.keys())
        self.intersect = self.set_current.intersection(self.set_past)
    def added(self):
        return self.set_current - self.intersect 
    def removed(self):
        return self.set_past - self.intersect 
    def changed(self):
        return set(o for o in self.intersect if self.past_dict[o] != self.current_dict[o])
    def unchanged(self):
        return set(o for o in self.intersect if self.past_dict[o] == self.current_dict[o])

这是一些示例输出:

>>> a = {'a': 1, 'b': 1, 'c': 0}
>>> b = {'a': 1, 'b': 2, 'd': 0}
>>> d = DictDiffer(b, a)
>>> print "Added:", d.added()
Added: set(['d'])
>>> print "Removed:", d.removed()
Removed: set(['c'])
>>> print "Changed:", d.changed()
Changed: set(['b'])
>>> print "Unchanged:", d.unchanged()
Unchanged: set(['a'])

可作为 github 存储库提供:https://github.com/hughdbown/dictdiffer

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

计算两个Python字典中包含的键的差异 的相关文章

随机推荐

  • 有没有办法在android平台上自动播放视频?

    我读了数十亿个关于堆栈溢出的论坛和帖子 但什么也没有 当我找到解决方案或类似的东西时 就不再工作了 我尝试使用 Google API 但什么也没有 我可以在 IOS 本机播放器中自动播放视频 将直接 mp4 链接放在标签 上 但在 Andr
  • 如何使用JavaScript控制音频元素

    首先 我尝试不使用默认的 html5 标准控件 如果可能的话我很乐意使用 jQuery 但我暂时将其删除 因为我不确定问题是什么 目前我只是想有一个播放按钮 单击后会播放一 些音乐 该按钮将更改为暂停按钮 一旦点击这个暂停按钮 音乐就会明显
  • BottomNavigationView 不存在

    我正在尝试将 navigationeditor 与底部导航视图一起使用 但似乎底部导航视图只是导致问题的原因 这是我的 xml
  • 将平面数组中的每个字符串复制 N 次

    我想将每个值重复 3 次并按正确的顺序排列 应使用其自身的 3 个副本来代替每个原始元素 给定以下一维字符串数组 chars a b c 所以结果是 duplicatedChars a a a b b b c c c 我尝试过与str re
  • Gradle 如何从 apk 中排除文件

    我将密钥库存储在资产目录中 如何在构建中排除它以创建 apk 我以这种方式尝试过 但仍然存在 android packagingOptions exclude META INF LICENSE txt exclude assets keys
  • 如何向 EF Core 中的所有实体添加相同的列?

    想象一下 我想向我的所有实体添加 IsDeleted 列或一些审核列 我可以创建一个基类 我的所有实体都将继承该基类 这将解决我的问题 但是我无法指定创建列的顺序 因此我最终会在实体的字段之前得到所有审核字段 这是我不想要的 我希望他们位于
  • 程序最小化后无法从任务栏检索

    我将提供一些关于我正在尝试做的事情的背景 我创建了一个自定义按钮 该按钮应该通过淡出动画最小化我的窗口 因此它的代码如下 private void minimize Window object sender EventArgs e var
  • 同一变量“args”有两个不同的值

    我正在从 python 脚本调用一个方法 其中一个变量作为 args 一旦我进入该方法 当我尝试查看变量 args 的值时 print args 并且仅执行 args 会显示两个不同的值 谁能告诉我这两个命令有什么区别 我希望这两个命令显示
  • javascript大整数舍入是因为精度? (为什么?)

    如果你这样做 for var i 0 i lt 30 i console log i 78764357878563800 console log 78764357878563790 i 78764357878563800 您开始比较从 78
  • GNU make 似乎忽略了中间文件的非终端匹配规则

    我的目录中有以下文件 FP01 c include
  • 禁用有关在派生类的复制构造函数内显式初始化基构造函数的警告

    我正在使用启用了 Wextra 的 g 版本 4 2 1 我包含来自库的标头 并且不断收到有关库中某个类的以下警告 该警告由 Wextra 启用 我已将类的实际名称替换为 BaseClass warning base class class
  • 找到 setTimeout() 中剩余的时间?

    我正在编写一些与我不拥有的库代码交互的Javascript 并且无法 合理地 更改 它创建 Javascript 超时 用于显示一系列限时问题中的下一个问题 这不是真正的代码 因为它被完全混淆了 这是图书馆正在做的事情 setup a ti
  • 帮助推文媒体实体

    我刚刚发现推文实体 我想将其添加到我的推文中 我已经读了一遍又一遍的API 但我仍然无法让它工作 这就是我所拥有的 entities array media url gt picture url url gt short url type
  • g++:如何整理导出的符号

    我正在尝试编译一个使用 JNI 的 Java 库 当我启动程序时 我看到崩溃并出现 UnsatisfiedLinkError 它表示在 DLL 中找不到特定方法 经过仔细检查 我发现我用于编译和链接的 g 通过在方法名称中添加 8 或 16
  • 分配的指针字段变为

    我有一个结构 type user struct Id string data ptr userData 我在全局范围内存储用户的一部分 type Hall struct users user var hall Hall global 最后
  • 使用 AVX2 向量化随机初始化并使用十进制数字数组打印 BigInt?

    如何将我的代码传递给 AVX2 代码并获得与以前相同的结果 是否可以使用 m256i在 LongNumInit 中 LongNumPrint 函数代替uint8 t L 或某种类似类型的变量 我对 AVX 的了解相当有限 我调查了很多 但是
  • 当我写入超出数组末尾时,为什么不会出现分段错误?

    为什么我编译时没有给出错误 include
  • 朱莉娅,加速评估

    Julia 有一个非常好的功能 可以访问自己的语法树 这使得以编程方式生成新函数变得很容易 但它比普通的 Julia 代码慢得多 例如 julia gt timing time for i in 1 100 tan pi 2 rand en
  • 如何在目标C中以相反的顺序显示数组[重复]

    这个问题在这里已经有答案了 我想以相反的顺序在 UITableView 中显示数据 我几乎不费吹灰之力就能做到这一点 但任何人都可以提供更好的方法来做到这一点 提前致谢 Use NSArray reverseObjectEnumerator
  • 计算两个Python字典中包含的键的差异

    假设我有两个 Python 字典 dictA and dictB 我需要查明是否存在任何密钥dictB但不在dictA 最快的方法是什么 我应该将字典键转换为一组然后继续吗 有兴趣了解您的想法 感谢您的回复 抱歉没有正确陈述我的问题 我的情