Сравните ключи и значения вложенных словарей в Python - PullRequest
0 голосов
/ 13 февраля 2019

Мне нужно сравнить словари в Python, и я написал следующий код:

diff_dict = {}
for key, value in old_dictionary.items():
    for k, v in new_dictionry.items():
        if k==key:
            inner_dict = {}
            for key1, value1 in value.items():
                for k1, v1 in v.items():
                    if key1==k1 and value1!=v1:
                        compared_value = str(value1) + '_' + str(v1)
                        inner_dict.update({key1: compared_value})
            diff_dict.update({k: inner_dict})

У меня есть несколько сайтов в качестве ключа, параметр в качестве внутренних ключей и значение для каждого параметра.Мне нужно сравнить текущий словарь со словарем предыдущего дня.

Но это не эффективно, это занимает полчаса, и все же, это не сделано.Есть ли эффективный способ сделать это?

Я хочу получить новый вложенный dict со структурой, подобной этой:

{key: {inner_key: compared_value}}

Сравненное значение объединяет новые и старые значения, поэтому я могу позжеразделите их на '_' и сделайте два столбца в пандах.

пример старых данных:

{'site-1/cell-1': {'tac' : 10, md: 5},
 'site-2/cell-1': {'tac' : 10, md: 1}}

новый:

{'site-1/cell-1': {'tac' : 10, md: 4},
 'site-2/cell-1': {'tac' : 12, md: 1}}

Желаемый вывод:

{{'site-1/cell-1': {md: '5_4'},
 'site-2/cell-1': {'tac' : '10_12'}}

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я не на 100% уверен, что это то, что вы хотите, основываясь на вашем вопросе.Но если вы хотите объединить «внутренние значения», вы можете использовать это:

diff_dict = {k_out: {k_in: f'{v_in}-{new_dictionary[k_out][k_in]}' for k_in, v_in in v_out.items()} for k_out, v_out in old_dictionary.items()}

Без использования однострочного генератора:

diff_dict = {}
for k_out, v_out in old_dictionary.items():
    for k_in, v_in in v_out.items():
        diff_dict.update({k_out: {k_in: f'{v_in}-{new_dictionary[k_out][k_in]}'}})

Если вы не увереныесли ключ существует, вы можете заменить dictionary[key] на dictionary.get(key, "").Это вернет пустую строку, если нет ключа, пара значений в ключе, который вы даете.

Для вводов:

old_dictionary = {'a': {'z': 111}, 'b': {'y': 999}}
new_dictionary = {'a': {'z': 444}, 'b': {'y': 777}}

Это дает:

{'a': {'z': '111-444'}, 'b': {'y': '999-777'}}
0 голосов
/ 13 февраля 2019

Следующее должно работать и быть значительно быстрее, чем у вас:

from collections import defaultdict


diff_dict = defaultdict(dict)
for key, value in old_dictionary.items():
    v = new_dictionary.get(key, None)
    if v:
        for key1, value1 in value.items():
            v1 = v.get(key1, None)
            if v1 and value1 != v1:
                compared_value = str(value1) + '_' + str(v1)
                diff_dict[key].update({key1: compared_value})

Кроме того, к вашему сведению, минимальный пример с вводом и желаемым результатом действительно сделает жизнь тех, кто хочет помочьПолегче.Имейте это в виду в следующий раз.

Я сам создал один:

old_dictionary = {'a': {'b': 1, 'c': 2}, 'd': {'f':5}}
new_dictionary = {'a': {'b': 2, 'c': 2}, 'd': {'f':6}}

, который производит:

defaultdict(<class 'dict'>, {'a': {'b': '1_2'}, 'd': {'f': '5_6'}})

и если тип данных defaultdict вКонец вас смущает, вы всегда можете преобразовать в ваниль - dict, просто применив:

diff_dict = dict(diff_dict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...