gpt4 book ai didi

Python - 比较 2 个二维字典

转载 作者:太空宇宙 更新时间:2023-11-04 00:18:11 25 4
gpt4 key购买 nike

尝试在 Python 中比较 2 个二维字典

编写这段代码:

import collections
import json
import pprint

def dict_compare(d1, d2):
d1_keys = set(d1.keys())
d2_keys = set(d2.keys())
intersect_keys = d1_keys.intersection(d2_keys)
added = d1_keys - d2_keys
removed = d2_keys - d1_keys
modified = {o: (d1[o], d2[o]) for o in intersect_keys if d1[o] != d2[o]}
same = set(o for o in intersect_keys if d1[o] == d2[o])
return added, removed, modified, same

checkslist = collections.defaultdict(dict)


checkslist['a'][0]="test1"
checkslist['a'][1]="test2"


with open('checklist.json',"w") as outfile:
json.dump(checkslist,outfile)


with open('checklist.json',"r") as infile:
data = json.load(infile)

added, removed, modified, same = dict_compare(data, checkslist)
print(added, removed, modified, same)

不幸的是,它不能很好地工作。它检测到它已被修改。

输出:

(set([]), set([]), {'a': ({u'1': u'test2', u'0': u'test1'}, {0: 'test1', 1: 'test2'})}, set([]))

第三组应该是空的。

如何正确比较 2 个二维字典?

谢谢,

更新 1:

checkslistbase = collections.defaultdict(dict)
checkslist = collections.defaultdict(dict)


checkslistbase['a'][0]="test1"
checkslistbase['a'][1]="test2"

checkslist['a'][0]="test1"
checkslist['a'][1]="test3"

想要将 checklistbase 与 checklist 进行比较。在这种情况下,它应该检测到 checklist['a'][1] 已更改(修改)。还应提及添加、删除或相同内容的时间。

最佳答案

你的比较功能没问题。

问题在于字典的序列化将整数键转换为字符串。

checkslist['a'][0]="test1"
checkslist['a'][1]="test2"

当你转储你得到:

{"a": {"0": "test1", "1": "test2"}}

使用 checkslist.copy()data 进行比较或使用字符串键,它将与 json 一起工作:

checkslist['a']["0"]="test1"
checkslist['a']["1"]="test2"

(另一种选择是将键与 str 转换进行比较,但这会强制更改代码中的很多内容并强制重新创建几乎每个输入)

如果您需要一些替代的 python-only 序列化,请使用 str(dict(checkslist)) 来编写 dict(您需要将其转换为标准 dict 以便能够将其解析回来)和ast.literal_eval 将其解析回来,因此保留了字典键中整数和字符串之间的区别。

with open('checklist.json',"w") as outfile:
outfile.write(str(dict(checkslist)))

with open('checklist.json',"r") as infile:
data = ast.literal_eval(infile.read())

通过这些更改,您的代码打印(如预期):

set() set() {} {'a'}

关于Python - 比较 2 个二维字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50155243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com