首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从python中的JSON复制键和列表内容

从python中的JSON复制键和列表内容
EN

Stack Overflow用户
提问于 2016-10-14 20:03:06
回答 1查看 826关注 0票数 1

我试图浏览一本字典,其中包含不对称的数据,并列出一个独特的标题。除了普通的键:值项之外,字典中的数据还包括其他字典、列表、字典列表、NoneTypes等等。如果可能的话,我希望能够保持键/索引的层次结构。这将用于评估数据的范围和可用性。数据来自JSON文件,其内容可能会更改。

我最近的尝试是通过函数skim()中的一系列类型检查来实现这一点,如下所示。

代码语言:javascript
复制
def skim(obj, header='', level=0):
    if obj is None:
        return

    def skim_iterable(iterable):
        lvl = level +1
        if isinstance(iterable, (list, tuple)):
            for value in iterable:
                h = ':'.join([header, iterable.index(value)])
                return skim(value, header=h, level=lvl)
        elif isinstance(iterable, dict):
            for key, value in iterable.items():
                h = ':'.join([header, key])
                return skim(value, header=h, level=lvl)


    if isinstance(obj, (int, float, str, bool)):
        return ':'.join([header, obj, level])
    elif isinstance(obj, (list, dict, tuple)):
        return skim_iterable(obj)

目的是对skim()进行递归调用,直到传递最高级的键或列表索引位置,然后返回为止。skim有一个处理可迭代对象的内部函数,该函数将级别与键值或列表索引位置一起传递给每个嵌套的迭代对象。

下面是一个例子

代码语言:javascript
复制
test = {"level_0Item_1": {
    "level_1Item_1": {
     "level_2Item_1": "value",
     "level_2Item_2": "value"
    },
    "level_1Item_2": {
     "level_2Item_1": "value",
     "level_2Item_2": {}
    }},
    "level_0Item_2": [
     {
      "level_1Item_1": "value",
      "level_1Item_2": 569028742
     }
    ],
    "level_0Item_3": []
   }

collection = [skim(test)]

现在,我将返回上述代码的[None],并希望得到一些帮助、疑难解答或如何最好地处理这些问题的指导。我所期待的是这样的事情:

代码语言:javascript
复制
['level_0Item_1:level_1Item_1:level_2Item_1',
 'level_0Item_1:level_1Item_1:level_2Item_2',
 'level_0Item_1:level_1Item_2:level_2Item_1',
 'level_0Item_1:level_1Item_2:level_2Item_2',
 'level_0Item_2:level_1Item_1',
 'level_0Item_2:level_1Item_2',
 'level_0Item_3]

在其他资源中,我最近遇到了这个问题( (python JSON complex objects (accounting for subclassing)),阅读了它,其中包含了参考资料。完全公开这里,我只是最近才开始编码。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-14 21:12:22

你可以尝试这样的方法:

代码语言:javascript
复制
 def skim(obj, connector=':', level=0, builded_str= ''):
    if isinstance(obj, dict):
        for k, v in obj.items():
            if isinstance(v, dict) and v:
                yield from skim(v, connector, level + 1, builded_str + k + connector)
            elif isinstance(v, list) and v:
                yield from skim(v[0], connector, level + 1, builded_str + k + connector)
            else:
                yield builded_str + k
    else:
        yield builded_str

测试:

代码语言:javascript
复制
test = {"level_0Item_1": {
    "level_1Item_1": {
     "level_2Item_1": "value",
     "level_2Item_2": "value"
    },
    "level_1Item_2": {
     "level_2Item_1": "value",
     "level_2Item_2": {}
    }},
    "level_0Item_2": [
     {
      "level_1Item_1": "value",
      "level_1Item_2": 569028742
     }
    ],
    "level_0Item_3": []
   }
lst = list(skim(test))
print(lst)
['level_0Item_1:level_1Item_2:level_2Item_1`', 
'level_0Item_1:level_1Item_2:level_2Item_2', 
'level_0Item_1:level_1Item_1:level_2Item_1', 
'level_0Item_1:level_1Item_1:level_2Item_2', 
'level_0Item_2:level_1Item_2',
'level_0Item_2:level_1Item_1', 
'level_0Item_3']`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40051155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档