在Python中递归地转换字典

2024-09-30 18:28:01 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一本字典:

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')]
                        ]
                    }
                }
            }
        }
    }
}

如果可能,我的目标是查找值并将其转换为字典:

^{pr2}$

我想这可以用递归实现,我甚至写了一个,但它不起作用。在

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

错误:

RecursionError: maximum recursion depth exceeded while calling a Python object

我怎么做的?在

如果你能提供一个没有递归的解决方案,我也很乐意得到它。在


Tags: keyin目标fordataif字典is
2条回答

你的程序中有一堆错误,让我们检查一下,然后想出一个有效的版本。在

def f(d):
  for key, value in d.iteritems():
    if type(d[key]) is dict:
      f(d)                        # You should call d[key] instead 
    try:
      d[key] = dict(d[key])       # Never assign an object back to the one you are iterating over, create a new object instead.
    except:
      if type(d[key]) is list:
        for i in d[key]:
          try:
            d[key][i] = dict(d[key][i])  # This doesn't work, can't convert a tuple/list this way.
          except:
            pass

  return d

下面是您的代码的更正版本,其中包含两个递归函数。一个是列表,另一个是字典。在

^{pr2}$

在这里测试:https://repl.it/LDKn/0

如果函数是字典,则递归调用d,而不是{}。在

只需将其更改为:

if type(value) is dict:
    f(value)

相关问题 更多 >