Python 为每次迭代删除dict中的叶节点

Python 为每次迭代删除dict中的叶节点,python,Python,我有一个JSON示例,如: {'key1': {'key2': 2, 'key3': 1, 'key4' : 1}} 我想删除每个叶节点一次,然后使用python打印JSON 为此,我有用于打印所有叶节点的代码。但是,有人能帮我写代码动态删除一个叶节点-一次一个吗 def print_all_leaf_nodes(data): if isinstance(data, dict): for item in data.values(): print_

我有一个JSON示例,如:

{'key1': {'key2': 2, 'key3': 1, 'key4' : 1}}
我想删除每个叶节点一次,然后使用python打印JSON

为此,我有用于打印所有叶节点的代码。但是,有人能帮我写代码动态删除一个叶节点-一次一个吗

def print_all_leaf_nodes(data):
    if isinstance(data, dict):
        for item in data.values():
            print_all_leaf_nodes(item)
    elif isinstance(data, list) or isinstance(data, tuple):
        for item in data:
            print_all_leaf_nodes(item)
    else:
        print data
输入:

{'key1': {'key2': 2, 'key3': 1, 'key4' : 1}}
输出:

{'key1': {'key3': 1, 'key4' : 1}}
{'key1': {'key2': 2, 'key4' : 1}}
{'key1': {'key2': 2, 'key3': 1}}
i、 e对于每个迭代,删除一个键值对,如果它是叶节点

注意:即使我能够从父级获取密钥路径,但不确定如何删除确切的元素

例如,如果json是

{ "key1" : { "key2" : { "key3": "value1", "key4" : "value2" }}}
我有一个递归函数,它返回一个字符串

key_to_be_removed = "key1.key2.key4"
但我不确定如何使用此字符串删除键4


请帮助。

听起来您有三个明显的问题:

  • 检测树中的叶节点
  • 根据某些条件从字典中删除键值对
  • 沿着树递归地执行此操作
  • 叶节点检测工作正常。对于后两个问题,我建议你仔细阅读

    删除某些值 要复制已删除某些值的词典,可以在词典中使用
    if

    def foo(d):
    返回{
    关键词:价值
    对于键,d.items()中的值
    如果某个条件(键、值)
    }
    
    其中
    某些条件是

    递归 这是。在递归地将方法应用于词典及其值的情况下,您只需在词典理解中包含递归引用:

    def foo(d):
    返回{
    关键字:foo(值)
    对于键,d.items()中的值
    }
    
    如果我了解到您的口述如下:

     g = {
      2: 3,
      4:
          {
              3: 4,
              34: {
                  36: 5,
                  8: 5,
                  7: 9,
                  9: 7
              },
              8: 9,
              9: {
                  3: 4
              }
          },
      89: 3
      }
    
    myTree = {
        tree: [3, 4, 5, 5, 9, 4],
        nodes: [2,4,[3,34,[36,8],8,9,[9,[3,4]]]]
        }
    
    本文描述了一个通用的树结构,其中每个节点都可以指向一个项目或子树

    如果需要对树进行迭代,并在每次迭代中返回不带叶的树,则可以使用生成器。您可以利用python不深度复制dict这一事实,因此,如果将dict传递给函数,然后在函数内部弹出一个元素,那么也会在函数外部弹出一个元素:

    此代码未经测试,请测试它 另一种方法是创建一个更好地重新呈现树的对象,例如,您可以开始注意,您可以使用如下内容重新呈现
    g

     g = {
      2: 3,
      4:
          {
              3: 4,
              34: {
                  36: 5,
                  8: 5,
                  7: 9,
                  9: 7
              },
              8: 9,
              9: {
                  3: 4
              }
          },
      89: 3
      }
    
    myTree = {
        tree: [3, 4, 5, 5, 9, 4],
        nodes: [2,4,[3,34,[36,8],8,9,[9,[3,4]]]]
        }
    
    你可能想要阅读和阅读。