当前位置: 首页 > 面试题库 >

两个python字典(键和值)的递归差异

湛铭
2023-03-14
问题内容

因此,我有一个python字典,将其称为d1,然后在稍后的某个时间将该字典的版本称为d2。我想找到d1和之间的所有更改d2。换句话说,添加,删除或更改的所有内容。棘手的是,值可以是整数,字符串,列表或字典,因此需要递归。这是我到目前为止所拥有的:

def dd(d1, d2, ctx=""):
    print "Changes in " + ctx
    for k in d1:
        if k not in d2:
            print k + " removed from d2"
    for k in d2:
        if k not in d1:
            print k + " added in d2"
            continue
        if d2[k] != d1[k]:
            if type(d2[k]) not in (dict, list):
                print k + " changed in d2 to " + str(d2[k])
            else:
                if type(d1[k]) != type(d2[k]):
                    print k + " changed to " + str(d2[k])
                    continue
                else:
                    if type(d2[k]) == dict:
                        dd(d1[k], d2[k], k)
                        continue
    print "Done with changes in " + ctx
    return

除非该值是一个列表,否则它将正常工作。我无法提出一种优雅的方式来处理列表,而又没有在此函数之后重复重复使用该函数的巨大变化if(type(d2) ==list)

有什么想法吗?

编辑:这与这篇文章不同,因为密钥可以更改


问题答案:

一种选择是将您遇到的所有列表转换成字典,并将索引作为键。例如:

# add this function to the same module
def list_to_dict(l):
    return dict(zip(map(str, range(len(l))), l))



# add this code under the 'if type(d2[k]) == dict' block
                    elif type(d2[k]) == list:
                        dd(list_to_dict(d1[k]), list_to_dict(d2[k]), k)

这是带有注释的示例词典的输出:

>>> d1 = {"name":"Joe", "Pets":[{"name":"spot", "species":"dog"}]}
>>> d2 = {"name":"Joe", "Pets":[{"name":"spot", "species":"cat"}]}
>>> dd(d1, d2, "base")
Changes in base
Changes in Pets
Changes in 0
species changed in d2 to cat
Done with changes in 0
Done with changes in Pets
Done with changes in base

请注意,这将按索引对索引进行比较,因此需要进行一些修改才能很好地适用于添加或删除的列表项。



 类似资料:
  • 问题内容: G’day, 我试图找到拖网字典的函数的递归深度,但我有点迷路了……目前,我有类似以下内容: 我想知道嵌套最多的字典是如何嵌套的…所以我要做以下… 唯一的问题是,递归循环仅返回最终值(0)的返回值。如果我输入一条打印语句, 那么我至少可以打印出最高的递归值,但是返回值是另一回事… 我敢肯定,这很简单-我刚买了果冻脑。 干杯 问题答案: 确保将递归调用的结果分配给 depth 。此外,正

  • 我在用Java。 我需要实现一个递归函数,计算每两个值之间的差值,并返回大小为2的数组。 对于以下阵列: 递归方法返回大小为2的数组:,因为最大差值为70,60的索引为2。 我有90%来自解决方案: 但是结果是而不是,因为这行

  • 问题内容: 我有以下字典 我想获取字典列表中每个字典值“ KA20”和“ KA23”的键“ tmst”的总和。 您能对此提出建议吗? 问题答案: 您可以使用: 请注意,要正常工作,必须按分组键进行排序:

  • 问题内容: 我有以下字典: 我想将一个条目附加到key1-> key2-> key3上,其值为’blah’,产生: 我正在寻找一种与键的数量无关的通用解决方案,即即使不存在从key3向下的键,key1-> key2-> key3-> key4-> key5也应该起作用。这样我得到: 提前致谢。 问题答案: 您可以使用该函数遍历一系列嵌套字典: 演示: 当密钥不存在时,此版本引发异常: 但您可以替换

  • 问题内容: 假设我有这样的字典: 有没有一种方法可以切换键和值来获取: 问题答案: my_dict2 = dict((y,x) for x,y in my_dict.iteritems()) 如果您使用的是python 2.7或3.x,则可以改用字典理解: 编辑 如JBernardo的评论所述,对于python 3.x,您需要使用而不是

  • 我怎么能把字典分成两个列表,一个键,一个值。例如采取: 并将其分为: 有什么想法吗,伙计们?