如何将两个嵌套字典比较并合并到另一个嵌套列表字典中?

时间:2018-11-20 04:32:09

标签: python list dictionary nested

我有两个嵌套字典-

Table 2

任务:对于Runid1中的每个测试,如果Runid2中存在该测试,我们将对该测试的两个嵌套字典进行比较。

基于某些条件,我们比较两个词典的每个参数(r值),并创建满足条件的此类参数的列表。我们将结果添加到另一个名为“结果”的字典中。

例如。对于Runid1中的每个测试,添加以列出所有小于10且r的差异大于4的r值。

Runid1 = { 'test1' : {'r1':6.0, 'r2':1.0, 'r3':3.0, 'r4':116.0, 'r5':80.0},
           'test2' : {'r1':5.0, 'r2':1.0, 'r3':1.0, 'r4':1.0, 'r5':80.0},
           'test3' : {'r1':5.0, 'r2':11.0, 'r3':50.0, 'r4':80.0, 'r5':20.0},
           'test4' : {'r1':7.0 , 'r2':9.0 , 'r3':5.0 , 'r4':1.0 , 'r5':80.0} }

Runid2 = { 'test1' : {'r1':1.0, 'r2':1.0, 'r3':2.0, 'r4':75.0, 'r5':79.0},
           'test5' : {'r1':1.0, 'r2':1.0, 'r3':1.0, 'r4':1.0, 'r5':80.0},
           'test3' : {'r1':2.0, 'r2':10.0, 'r3':45.0, 'r4':60.0, 'r5':80.0},
           'test4' : {'r1':1.0, 'r2':1.0, 'r3':1.0,  'r4':1.0, 'r5':80.0} }

2 个答案:

答案 0 :(得分:1)

>>> def cmp_r(r1, r2):
...     return r1 < 10 and r2 < 10 and abs(r1 - r2) >= 4
...
>>> def merge_r(d1, d2):
...     return {k: [v, d2[k]] for k,v in d1.items() if k in d2 and cmp_r(v, d2[k])}
...
>>> Result = {k: merge_r(v, Runid2[k]) for k,v in Runid1.items() if k in Runid2}
>>> Result
{'test1': {'r1': [6.0, 1.0]},
 'test3': {},
 'test4': {'r1': [7.0, 1.0], 'r2': [9.0, 1.0], 'r3': [5.0, 1.0]}}

答案 1 :(得分:0)

您可以尝试遍历相交的键,然后根据您的条件将结果添加到字典中:

from pprint import pprint

Runid1 = {
    "test1": {"r1": 6.0, "r2": 1.0, "r3": 3.0, "r4": 116.0, "r5": 80.0},
    "test2": {"r1": 5.0, "r2": 1.0, "r3": 1.0, "r4": 1.0, "r5": 80.0},
    "test3": {"r1": 5.0, "r2": 11.0, "r3": 50.0, "r4": 80.0, "r5": 20.0},
    "test4": {"r1": 7.0, "r2": 9.0, "r3": 5.0, "r4": 1.0, "r5": 80.0},
}

Runid2 = {
    "test1": {"r1": 1.0, "r2": 1.0, "r3": 2.0, "r4": 75.0, "r5": 79.0},
    "test5": {"r1": 1.0, "r2": 1.0, "r3": 1.0, "r4": 1.0, "r5": 80.0},
    "test3": {"r1": 2.0, "r2": 10.0, "r3": 45.0, "r4": 60.0, "r5": 80.0},
    "test4": {"r1": 1.0, "r2": 1.0, "r3": 1.0, "r4": 1.0, "r5": 80.0},
}

result = {}
for key in Runid1.keys() & Runid2.keys():
    result[key] = {}

    for k1, k2 in zip(Runid1[key], Runid2[key]):
        v1, v2 = Runid1[key][k1], Runid2[key][k2]

        if v1 < 10 and v2 < 10 and abs(v1 - v2) >= 4:
            result[key][k1] = [v1, v2]

pprint(result)

其中给出以下内容:

{'test1': {'r1': [6.0, 1.0]},
 'test3': {},
 'test4': {'r1': [7.0, 1.0], 'r2': [9.0, 1.0], 'r3': [5.0, 1.0]}}

但是,上述方法假定键的顺序为zip(),只有在 Python3.6 + 中才能保证。

如果使用的是较低版本的Python,则我们需要首先检查第二个字典中是否存在第一个字典中的键:

result = {}
for key in Runid1.keys() & Runid2.keys():
    result[key] = {}

    for k1, v1 in Runid1[key].items():
        if k1 in Runid2[key]:
            v2 = Runid2[key][k1]

            if v1 < 10 and v2 < 10 and abs(v1 - v2) >= 4:
                result[key][k1] = [v1, v2]