仅显示嵌套字典中的差异
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 内部值。
数据来自数据库和 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 内部值。