在Python中递归转换字典

bay*_*bay 5 python recursion dictionary

这是字典:

data = {
    'a': {
        'b': {
            'c': {
                'd': {
                    'e': {
                        'f': 1,
                        'g': 50,
                        'h': [1, 2, 4],
                        'i': 3,
                        'j': [7, 9, 6],
                        'k': [
                            [('x', 'abc')],
                            [('y', 'qwe')],
                            [('z', 'zxc')]
                        ]
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是在可能的情况下查找值并将其转换为字典:

data = {
    'a': {
        'b': {
            'c': {
                'd': {
                    'e': {
                        'f': 1,
                        'g': 50,
                        'h': [1, 2, 4],
                        'i': 3,
                        'j': [7, 9, 6],
                        'k': [{
                            'x': 'abc'
                        }, {
                            'y': 'qwe'
                        }, {
                            'z': 'zxc'
                        }]
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为可以使用递归来完成,我什至已经写了一篇,但是没有用。

def f(d):
  for key, value in d.iteritems():
    if type(d[key]) is dict:
      f(d)

    try:
      d[key] = dict(d[key])
    except:
      if type(d[key]) is list:
        for i in d[key]:
          try:
            d[key][i] = dict(d[key][i])
          except:
            pass

  return d
Run Code Online (Sandbox Code Playgroud)

错误:

RecursionError:调用Python对象时超出最大递归深度

我该如何运作?

如果您可以提供不递归的解决方案,我也会很高兴获得。

Dan*_*sky 0

您可以递归地调用该函数,d而不是value如果它是字典。

只需将其更改为:

if type(value) is dict:
    f(value)
Run Code Online (Sandbox Code Playgroud)