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

Python 如何将两个嵌套字典比较并合并到另一个嵌套的列表字典中?,python,list,dictionary,nested,Python,List,Dictionary,Nested,我有两本嵌套字典- 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}, 't

我有两本嵌套字典-

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} }
任务:对于Runid1中的每个测试,如果该测试存在于Runid2中,我们将比较该测试的两个嵌套字典

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

例如,对于Runid1中的每个测试,添加到列表中,列出所有小于10且它们之间的差值大于4的r值

Result = { 'test1' : {'r1':[6.0,1.0]},
           'test3' : {},
           'test4' : {'r1':[7.0,1.0], 'r2':[9.0,1.0], 'r3':[5.0,1.0]} }
def cmp_r(r1,r2): ... 返回r1<10和r2<10且abs(r1-r2)>=4 ... >>>def合并(d1、d2): ... 为d1中的k,v返回{k:[v,d2[k]]。如果d2中的k和cmp_r(v,d2[k]),则返回items() ... >>>Result={k:Runid1中k,v的merge_r(v,Runid2[k])。如果Runid2}中有k,则为items() >>>结果 {'test1':{'r1':[6.0,1.0]}, 'test3':{}, 'test4':{'r1':[7.0,1.0],'r2':[9.0,1.0],'r3':[5.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)
但是,上述方法假设键的顺序为,这仅在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]
result={}
对于Runid1.keys()和Runid2.keys()中的键:
结果[键]={}
对于k1,Runid1[key]中的v1。项()
如果Runid2中的k1[键]:
v2=Runid2[键][k1]
如果v1<10且v2<10且abs(v1-v2)>=4:
结果[键][k1]=[v1,v2]

这似乎是个家庭作业问题,你还没有表现出任何尝试。请包括你迄今为止所做的尝试,以及你遇到的具体问题。嗨,这项任务不是家庭作业。我是python新手,想不出一个方法来解决它。
{'test1': {'r1': [6.0, 1.0]},
 'test3': {},
 'test4': {'r1': [7.0, 1.0], 'r2': [9.0, 1.0], 'r3': [5.0, 1.0]}}
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]