【问题标题】:Remove a list of string-dotted named keys from a Python dictionary从 Python 字典中删除一个字符串点的命名键列表
【发布时间】:2021-11-09 20:17:54
【问题描述】:

这几天我一直在寻找解决问题的方法。我不会涵盖到目前为止我尝试过的所有事情,只会解释我的问题。

这是我的两个输入:

unused_field_list = ['a.b', 'b.d.y', 'c.g', 'z']

my_dictionnary =
{
  "a": {
    "b": {
      "key": "value"
    },
    "c": {
      "f": {
        "key": "value"
      }
    }
  },
  "b": {
    "d": {
      "y": {
        "key": "value"
      }
    },
    "g": {
      "key": "value"
    }
  },
  "c": {
    "g" : {
      "key": "value"
    }
  },
  "z": {
    "key": "value"
  }
} 

这是我想要的输出:

{
  "a": {
    "c": {
      "f": {
        "key": "value"
      }
    }
  },
  "b": {
    "g": {
      "key": "value"
    }
  }
}

所以我试图实现的是从我的字典中删除我的unused_field_list 中的“键”。这不是强制性的,但另一件好事是如果它不包含较低级别的键(就像我的示例中的 b.dc 键的情况一样),也可以完全删除它。字典的深度在进步和变化。

我认为这不能通过简单的方法实现,但我真的希望有一种方法可以非常简单地做到这一点。

【问题讨论】:

    标签: python dictionary recursion key


    【解决方案1】:

    你可以使用递归:

    paths = ['a.b', 'b.d.y', 'c.g', 'z']
    d = {'a': {'b': {'key': None}, 'c': {'f': {'key': None}}}, 'b': {'d': {'y': {'key': 'value'}}, 'g': {'key': 'value'}}, 'c': {'g': {'key': 'value'}}, 'z': {'key': 'value'}}
    def rm_d(d, p = []):
       if not isinstance(d, dict):
          return d
       r = {a:rm_d(b, p+[a]) for a, b in d.items() if '.'.join(p+[a]) not in paths}
       return {a:b for a, b in r.items() if not isinstance(b, dict) or b}
    
    print(rm_d(d))
    

    输出:

    {'a': {'c': {'f': {'key': None}}}, 'b': {'g': {'key': 'value'}}}
    

    【讨论】:

      【解决方案2】:
      unused_field_list = ['a.b', 'b.d.y', 'c.g', 'z']
      
      my_dictionnary = {
        "a": {
          "b": {
            "key": "value"
          },
          "c": {
            "f": {
              "key": "value"
            }
          }
        },
        "b": {
          "d": {
            "y": {
              "key": "value"
            }
          },
          "g": {
            "key": "value"
          }
        },
        "c": {
          "g" : {
            "key": "value"
          }
        },
        "z": {
          "key": "value"
        }
      }
      
      def filter_dict(node, filter=None, path=None):
          
          if type(node) != dict:
              return node
          
          res = {}
          
          if filter is None:
              filter = []
          
          if path is None:
              path = ""
          
          for k, v in node.items():
              subpath = f"{path}.{k}" if path != "" else k
              if subpath not in filter:
                  subnode = filter_dict(v, filter, subpath)
                  if subnode != {}:
                      res [k] = subnode
          
          return res
      
      res = filter_dict(my_dictionnary, unused_field_list)
      
      print(res)
      

      【讨论】:

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