Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以任意深度提取嵌套json数据中的所有键_Python_Json - Fatal编程技术网

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

Python 以任意深度提取嵌套json数据中的所有键,python,json,Python,Json,我有一个json,它只不过是一个无序转储,它由dict、list和unicode值的混合体组成,嵌套深度从1到10不等。下面是我正在处理的一个粗略简化的示例: {'name': 'TheDude', 'age': '19', 'hobbies': { 'love': 'eating', 'hate': 'reading', 'like': [ {'outdoor': {

我有一个json,它只不过是一个无序转储,它由dict、list和unicode值的混合体组成,嵌套深度从1到10不等。下面是我正在处理的一个粗略简化的示例:

{'name': 'TheDude',
 'age': '19',
 'hobbies': {
         'love': 'eating',
         'hate': 'reading',
         'like': [
                 {'outdoor': {
                         'teamsport': 'soccer',
                        }
                 }
                 ]
        }
  }
我想要以下输出(基于上述内容):

我尝试了以下代码:

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

基于,但到目前为止没有运气。有人对如何使其工作有好的想法吗?

以下递归函数可以工作:

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
值)向下传递到递归

以下递归函数将起作用:

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
值)向下传递到递归

。。。[key7:{key8:'eight,}]…
不是有效的Python数据结构。此外,请将按键设置为真正的字符串文字,以便有意愿的助手可以复制和粘贴您的示例输入。为清晰起见,修改了问题
。。。[key7:{key8:'eight,}]…
不是有效的Python数据结构。此外,请将按键设置为真实的字符串文字,以便有意愿的助手可以复制和粘贴您的示例输入。为清晰起见,修改了问题