比较两个嵌套字典并将其值的差异存储到新字典中

时间:2019-07-16 19:56:58

标签: json python-3.x dictionary

我有一本字典(long_dict),里面装有3类不同人员的数据。我正在尝试比较特定类别(category_2)的值,并将它们的差异分别存储到新词典中。

message.author

我希望建立一个存储值差异的字典;像这样的东西。

long_dict = {

'PERSON1':{
'category_1' :{
},
'category_2': {
'a': 20,
'b': 40,
'c': 60,
'd': 45
},
'category_3': {
}
},

'PERSON2': {
'category_1' :{
},
'category_2': {
'a': 30,
'b': 10,
'c': 40,
'd': 55
},
'category_3': {
}
},

'PERSON3': {
'category_1' :{
},
'category_2': {
'a': 60,
'b': 10,
'c': 35,
'd': 25
},
'category_3: {
}
},
'PERSON4': {
'category_1' :{
},
'category_2': {
'a': 30,
'b': 15,
'c': 65,
'd': 55
},
'category_3': {
}
}
}

到目前为止,我已经尝试过:

result = {

'PERSON1':{
'PERSON2' :{
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
},
'PERSON3': {
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
},
'PERSON4': {
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
}
},
'PERSON2':{
'PERSON1' :{
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
},
'PERSON3': {
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
},
'PERSON4': {
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
 }
 },
'PERSON3':{
'PERSON1' :{
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
},
'PERSON2': {
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
},
'PERSON4': {
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
}
},

'PERSON4':{
'PERSON1' :{
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
},
'PERSON2': {
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
},
'PERSON3': {
'diff_a': ...,
'diff_b': ...,
'diff_c': ...,
'diff_d': ...
}
}
}

而且,这就是我得到的印刷品(fin):

abc = dict()
xyz = dict()
fin = dict()
i = 0
for k, v in long_dict.items():
for a, b in long_dict.items():
    if k != a:
        for k2, v2 in v.items():
            for a2, b2 in b.items():
                if k2 == a2 == "category_2":
                    for k3, v3 in v2.items():
                        for a3, b3 in b2.items():
                            if k3 == a3:
                                abc[k3] = abs(v3-b3)
        xyz[a] = abc
        i+=1                        
        if i > 3:
            fin[k] = xyz
            i=0

1 个答案:

答案 0 :(得分:0)

比较和存储值的更有效方法是只比较和存储每个唯一比较一次(而不是比较和存储比较中涉及的每个dict键的相同比较)。您可以使用itertools.combinations使其保持简单,并通过元组键访问每个比较(以下方法假定每个比较类别dict包含相同的键-如果不是,则您必须添加一些其他键检查)。

from itertools import combinations

d = {'PERSON1':{'category_1' :{}, 'category_2': {'a': 20, 'b': 40, 'c': 60, 'd': 45}, 'category_3': {}}, 'PERSON2': {'category_1' :{}, 'category_2': {'a': 30, 'b': 10, 'c': 40, 'd': 55}, 'category_3': {}}, 'PERSON3': {'category_1' :{}, 'category_2': {'a': 60, 'b': 10, 'c': 35, 'd': 25}, 'category_3': {}}, 'PERSON4': {'category_1' :{}, 'category_2': {'a': 30, 'b': 15, 'c': 65, 'd': 55}, 'category_3': {}}}

compare = {}
for a, b in combinations(sorted(d.keys()), 2):
    acat = d[a]['category_2']
    bcat = d[b]['category_2']
    compare[(a, b)] = {k: abs(acat[k] - bcat[k]) for k in acat}

print(compare)
# {('PERSON1', 'PERSON2'): {'a': 10, 'b': 30, 'c': 20, 'd': 10}, ('PERSON1', 'PERSON3'): {'a': 40, 'b': 30, 'c': 25, 'd': 20}, ('PERSON1', 'PERSON4'): {'a': 10, 'b': 25, 'c': 5, 'd': 10}, ('PERSON2', 'PERSON3'): {'a': 30, 'b': 0, 'c': 5, 'd': 30}, ('PERSON2', 'PERSON4'): {'a': 0, 'b': 5, 'c': 25, 'd': 0}, ('PERSON3', 'PERSON4'): {'a': 30, 'b': 5, 'c': 30, 'd': 30}}