尝试在 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"
想要将 list 库与 list 进行比较。在这种情况下,它应该检测到 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的序列化,请使用str(dict(checkslist))
来编写字典(您需要将其转换为标准字典才能解析它)并且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/