仅显示嵌套字典中的差异

Display only difference in nested dicts

数据来自数据库和 csv 文件。 我必须尽快比较它们并用相应的值更新数据库table。 假设 dict d1 来自数据库,而 d2 来自输入文件。 主键是数据库中的主键。 (此处为 1 和 2)

d1[1] = {'a': 10, 'b': 20}
d1[2] = {'a': 11, 'b': 21}

现在来自输入文件的数据:

d2[1] = {'b': 10, 'a': 20}
d2[2] = {'b': 21, 'a': 19}

如您所见,键 1 的所有值都不同,键 2 只有 'a' 的值不同。 我有以下查询:

print({o: ({b: d2[o][b]}) for o in d1.keys() for b in d2[o].keys() if d1[o][b] != d2[o][b]})

预期结果为:

{1: ({'a': 20}, {'b': 10}), 2: {'a': 19}}

我得到了这个结果而不是这个(我没有列出 1 的所有修改值):

{1: {'a': 20}, 2: {'a': 19}}

我错过了什么?

你需要在你的dict comp中嵌套一个list comp。

{o: [{b: d2[o][b]} for b in d2[o].keys() if d1[o][b] != d2[o][b]] for o in d1.keys()}

这是解决方案(如果您不介意更详细的解决方案)

d1={}
d2={}
d1[1] = {'a': 10, 'b': 20}
d1[2] = {'a': 11, 'b': 21}
d2[1] = {'b': 10, 'a': 20}
d2[2] = {'b': 21, 'a': 19}

d4={}

for o in d1.keys():
    d3=[]
    for b in d2[o].keys():
        if d1[o][b] != d2[o][b]:
               d3.append({b: d2[o][b]})
    d4.update({o:tuple(d3)})
print(d4) # require solution.
# print {1: ({'b': 10}, {'a': 20}), 2: ({'a': 19},)}

在您的代码中,您忘记了 add/update 内部值。