簡體   English   中英

如何將兩個嵌套字典比較並合並到另一個嵌套列表字典中?

[英]How to compare and merge two nested dictionaries into another nested dictionary of lists?

我有兩個嵌套的字典-

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值),並創建滿足條件的此類參數的列表。 我們將結果添加到另一個名為“結果”的字典中。

例如。 對於Runid1中的每個測試,添加以列出所有小於10且r之間的差異大於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):
...     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]}}

您可以嘗試遍歷相交的鍵,然后根據您的條件將結果添加到字典中:

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM