比较Python中嵌套字典的键和值

时间:2019-02-13 14:06:53

标签: python dictionary nested

我需要比较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})

我有一些站点作为键,参数作为内键以及每个参数的值。我需要将当前词典与前一天的词典进行比较。

但是效率不高,需要半个小时,但仍然没有完成。有什么有效的方法吗?

我想要一个具有以下结构的新嵌套字典:

{key: {inner_key: compared_value}}

比较值是由新值和旧值串联而成的,因此我以后可以用'_'对其进行拆分,并在Pandas中创建两列。

数据示例 旧的:

{'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 :(得分:1)

以下内容应该可以工作,并且比您的要快得多:

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)

答案 1 :(得分:1)

根据您的问题,我不确定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'}}