仅显示嵌套字典的差异

时间:2018-12-19 22:23:03

标签: python dictionary difference

数据来自数据库和csv文件。 我必须尽快比较它们,并通过相应的值更新数据库表。 假设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}}

我想念什么?

2 个答案:

答案 0 :(得分:2)

您需要将列表组件嵌套在字典组件中。

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

答案 1 :(得分:0)

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

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},)}

在您的代码中,您忘记添加/更新内部值。