【问题标题】:Remove key and its value in nested dictionary using python使用python删除嵌套字典中的键及其值
【发布时间】:2020-03-15 05:45:45
【问题描述】:

寻找一个 通用 解决方案,我可以在其中从 dict 中删除特定键及其值。 例如,如果 dict 包含以下嵌套键值对:

data={

  "set": {
  "type": "object", #<-- should remove this key:value pair
  "properties": {
    "action": {
      "type": "string",  #<-- should NOT remove this key:value pair
      "description": "My settings"
    },
    "settings": {
      "type": "object", #<-- should remove this key:value pair
      "description": "for settings",
      "properties": {
        "temperature": {
          "type": "object", #<-- should remove this key:value pair
          "description": "temperature in degree C",
          "properties": {
            "heater": {
              "type": "object", #<-- should remove this key:value pair
              "properties": {
                "setpoint": {
                  "type": "number"
                },
              },
              "additionalProperties": false
            },

          },
          "additionalProperties": false
        },

      },
      "additionalProperties": false
    }
  },
  "additionalProperties": false
}
}

我想要一个没有"type":"object" 的输出 dict 跨越这个键:值对的出现。 预期的输出应该产生没有"type":"object"的结果

【问题讨论】:

标签: python dictionary recursion nested


【解决方案1】:

你可以写一个递归函数:

def remove_a_key(d, remove_key):
    if isinstance(d, dict):
        for key in list(d.keys()):
            if key == remove_key:
                del d[key]
            else:
                remove_a_key(d[key], remove_key)

并将其称为:

remove_a_key(data, 'type')

这会递归地从每个嵌套字典中删除 'type' 键和它的值,无论它有多深。

【讨论】:

  • 您的逻辑删除所有出现的键“类型”。这意味着逻辑删除了预期的type:'object',但它也删除了不是预期结果的type':'string'。希望我明确要求。
  • 感谢您的逻辑。修改以满足我的要求。请查看修改后的逻辑。 def remove_a_key(d, remove_key, remove_val): if isinstance(d, dict): for key in list(d.keys()): if key == remove_key and d[key] == remove_val: del d[key] else: remove_a_key(d[key], remove_key,remove_val) import json with open('test.json') as f: myjson = json.load(f) path = [] remove_a_key(myjson, 'type','string')
  • @shekarchandra,您的代码看起来不错。也许我读错了,我回答删除所有键而不考虑值。但希望我的回答对您有所帮助。请通过单击答案左侧的勾号接受已经发布的两个有用的答案(这有助于社区识别有用的解决方案)。谢谢。
【解决方案2】:

使用 python 模块nested-lookup 来处理任何类型的嵌套文档。 结帐https://pypi.org/project/nested-lookup/ 了解更多信息。

在您的情况下,您需要使用方法 nested_delete 删除所有出现的键。

用法:

from nested_lookup import nested_delete

print(nested_delete(data, 'type'))

【讨论】:

    【解决方案3】:

    递归函数出现以下错误:

    对于列表中的键(d.keys()): TypeError: 'dict' 对象不可调用

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2021-09-20
    相关资源
    最近更新 更多