如何根据另一个字典删除字典的键和值?

时间:2014-09-10 11:53:34

标签: python

我希望根据另一个JSON字典的键和值删除一个JSON字典中的键和值。从某种意义上说,我正在寻找“减法”。假设我有JSON词典ab

a =  {
     "my_app":
        {
        "environment_variables":
           {
            "SOME_ENV_VAR":
                [
                "/tmp",
                "tmp2"
                ]
           },

        "variables":
           { "my_var": "1",
             "my_other_var": "2"
           }
        }
     }

b =  {
      "my_app":
        {
        "environment_variables":
           {
            "SOME_ENV_VAR":
                [
                "/tmp"
                ]
           },

        "variables":
           { "my_var": "1" }
        }
     }

想象一下,你可以a - b = c c看起来像这样:

c =  {
       "my_app":
       {
        "environment_variables":
           {
            "SOME_ENV_VAR":
                [
                "/tmp2"
                ]
           },

        "variables":
           { "my_other_var": "2" }
       }
     }

如何做到这一点?

3 个答案:

答案 0 :(得分:1)

您可以使用for key in dictionary:循环浏览字典,然后使用del dictionary[key]删除密钥,我认为这就是您所需要的。请参阅词典文档:https://docs.python.org/2/tutorial/datastructures.html#dictionaries

答案 1 :(得分:0)

以下是您需要的:

    def subtract(a, b):
        result = {}

        for key, value in a.items():
            if key not in b or b[key] != value:
                if not isinstance(value, dict):
                    if isinstance(value, list):
                        result[key] = [item for item in value if item not in b[key]]
                    else:
                        result[key] = value
                    continue

                inner_dict = subtract(value, b[key])
                if len(inner_dict) > 0:
                    result[key] = inner_dict

        return result

检查keyvalue是否存在。它可以是del个项目,但我认为使用所需数据返回一个新的dict要好得多,而不是修改原始数据。

   c = subtract(a, b)

<强>更新

我刚刚更新了问题中提供的最新版数据。现在它减去&#39;列出值。

更新2

工作示例:ipython notebook

答案 2 :(得分:0)

你可以这样做:

  1. 创建a - &gt;的副本c;
  2. key, value;
  3. 中的每个b对进行迭代
  4. 检查同一top keys是否有相同的inner keys and values,并将其从c删除;
  5. 使用keys删除empty values
  6. 如果你的情况有所不同(没有dict(dict)等),你应该修改代码。


    print(A)
    print(B)
    C = A.copy()
    
    # INFO: Suppose your max depth is as follows: "A = dict(key:dict(), ...)"
    for k0, v0 in B.items():
        # Look for similiar outer keys (check if 'vars' or 'env_vars' in A)
        if k0 in C:
            # Look for similiar inner (keys, values)
            for k1, v1 in v0.items():
                # If we have e.g. 'my_var' in B and in C and values are the same
                if k1 in C[k0] and v1 == C[k0][k1]:
                    del C[k0][k1]
            # Remove empty 'vars', 'env_vars'
            if not C[k0]:
                del C[k0]
    
    print(C)
    

    {'environment_variables': {'SOME_ENV_VAR': ['/tmp']}, 
     'variables': {'my_var': '2', 'someones_var': '1'}}
    
    {'environment_variables': {'SOME_ENV_VAR': ['/tmp']},
     'variables': {'my_var': '2'}}
    
    {'variables': {'someones_var': '1'}}