【问题标题】:Compare keys and values of nested dictionaries in Python比较 Python 中嵌套字典的键和值
【发布时间】:2019-07-07 09:35:23
【问题描述】:

我需要在 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'}}

【问题讨论】:

  • 使用字典的 O(1) 查找属性!不要只遍历所有项目对。
  • 你能发布一个示例数据和预期输出吗?
  • @MehrdadPedramfar 我刚刚编辑了我的问题 :)

标签: python dictionary nested


【解决方案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 数据类型让您感到困惑,您可以随时转换为 vanilla-dict,只需通过转换:

diff_dict = dict(diff_dict)

【讨论】:

  • 我已经编辑了我的问题。 :) 随着你的输出,我得到空的内部字典
  • 你能再试一次吗?我得到defaultdict(&lt;class 'dict'&gt;, {'site-1/cell-1': {'md': '5_4'}, 'site-2/cell-1': {'tac': '10_12'}}) 作为你的例子。
  • 是的,我认为这行得通。 :) 非常感谢。 :)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多