Python - 比较2个二维字典

标签 python dictionary

尝试在 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/

相关文章:

python - 在 Python 中检索值的字典的嵌套字典列表

python - 在python中循环更新字典键

Python - 将一个复杂的文件读入字典

c++ - python tcp 服务器和 c++ 客户端之间的对话

ios - 按键值对字典数组进行排序

python - pandas groupby 计算字符串在列上的出现次数

python - Pip 没有安装任何东西

C# - Lambda/LINQ - 从 Dictionary<string, string>[] 到 List<string[]> 的转换

python - Django 模板 : accessing the previous and the following element of the list

python - Django : Adding a property to the User class. 在运行时更改它和 UserManager.create_user