以任意深度提取嵌套json数据中的所有键

2024-09-30 03:24:35 发布

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

我有一个json,它只不过是一个无序的转储文件,它由dict、list和unicode值组成,嵌套深度从1到10不等。下面是一个粗略简化的例子:

{'name': 'TheDude',
 'age': '19',
 'hobbies': {
         'love': 'eating',
         'hate': 'reading',
         'like': [
                 {'outdoor': {
                         'teamsport': 'soccer',
                        }
                 }
                 ]
        }
  }

我想要以下输出(基于上述内容):

[name, age, hobbies_love, hobbies_hate, hobbies_like_outdoor_teamsport]

我尝试了以下代码:

def printinoice(dictionary,arr):
    for k, v in dictionary.iteritems():
        arr.append(k)
        if isinstance(v, dict):
            for result in printinoice(v,arr):
                arr.append(result)
        elif isinstance(v, list):
            for d in v:
                for result in printinoice(d,arr):
                    arr.append(result)
    return arr

基于this但到目前为止没有运气。有人对如何使它工作有好主意吗?你知道吗


Tags: nameinforageresultdictlistlike
1条回答
网友
1楼 · 发布于 2024-09-30 03:24:35

以下递归函数将起作用:

def deep_keys(dct):
   if not isinstance(dct, (dict, list)):
      return ['']
   if isinstance(dct, list):
      return [dk for x in dct for dk in deep_keys(x)]
   return [k+('_'+dk if dk else '') for k, v in dct.items() for dk in deep_keys(v)]

>>> deep_keys(d)
['name', 'age', 'hobbies_love', 'hobbies_hate', 'hobbies_like_outdoor_teamsport']

最简单的方法是不为函数参数假定给定的类型,这样就可以在递归中传递任何嵌套的内容(即list元素和dict值)。你知道吗

相关问题 更多 >

    热门问题