Как сравнить и объединить два вложенных словаря в другой вложенный словарь списков? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть два вложенных словаря -

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 добавьте в список все значения r, которые меньше 10, а разница между ними равна> 4.

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

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы можете попробовать зациклить пересекающиеся ключи, а затем добавить результаты в словарь в зависимости от ваших условий:

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]
0 голосов
/ 20 ноября 2018
>>> 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]}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...