Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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 使用嵌套元素处理dicts/json_Python_Json_Dictionary - Fatal编程技术网

Python 使用嵌套元素处理dicts/json

Python 使用嵌套元素处理dicts/json,python,json,dictionary,Python,Json,Dictionary,tldrpython3.8。我希望使用一个没有空条目的“干净”dict来生成足够的json输出。对于这种情况,我需要一个处理它并支持嵌套结构的函数。此解决方案应该足够通用,可以处理n个嵌套对象 我希望使用一个没有空条目的“干净”dict,以在Python3.8中生成足够的json输出。在内部,我使用dict存储所有稍后将转储到磁盘的内容。我知道{}是一个有效的json(而且{“数据”:{}}也是),但我知道它不是干净的。解析这种json只表明没有存储任何有用的内容 因此,我们的想法是通过检查添加

tldrpython3.8。我希望使用一个没有空条目的“干净”dict来生成足够的json输出。对于这种情况,我需要一个处理它并支持嵌套结构的函数。此解决方案应该足够通用,可以处理n个嵌套对象

我希望使用一个没有空条目的“干净”dict,以在Python3.8中生成足够的json输出。在内部,我使用dict存储所有稍后将转储到磁盘的内容。我知道
{}
是一个有效的json(而且
{“数据”:{}}
也是),但我知道它不是干净的。解析这种json只表明没有存储任何有用的内容

因此,我们的想法是通过检查添加或删除到json的键/值来避免这种不干净的json。这应该支持嵌套值,如
{“os”:{“网络”:{“ip”:“localhost”“}}}}
(任意深度),可以在OOP样式中使用,例如
def handleElement(键、值、**节)
。如果该值为空,则应“清理”dict,如果该节没有内容,则删除每个节

经过数小时的搜索,我既没有找到一个python内置的方法,也没有在web上找到一些扩展或解决方案。我自己做了很多尝试,但是我发现没有办法在dict上进行平滑的迭代和操作。因为带有嵌套元素的dict的调用语法是
dict[][]]…

你有什么好主意吗?如果您需要更多信息或不清楚,请询问

示例:

dict before: {}

call handleElement(“ip”,”localhost”, [os, network])
dic after: {“os”: {“network”: {“ip”: “localhost”}}

call handleElement (“ip”,””, [os, network])
dic after: {}

call handleElement (“ip”,”localhost”, [os, network])
call handleElement (“subnetmask”,”full”, [os, network])
dic after: {“os”: {“network”: {“ip”: “localhost”, “subnetmask”:”full”}}

call handleElement (“ip”,””, [os, network])
dic after: {“os”: {“network”: { “subnetmask”:”full”}}

您可能不需要递归方法,您需要的是

  • 当值不为空时
  • 建立父母的道路
  • 设置
    键/值
    映射

  • 处理多层嵌套结构是递归解决方案的完美案例。堆栈溢出通常不会只是为您编写代码。。。相反,你需要开始,当你遇到逻辑问题时,来寻求帮助。。。我会从
    def handleElement(key,value,parents_list)
    @Błotosmętek开始:我完全同意,但是如果我需要dict访问的深度级别,我没有办法进行递归。@JoranBeasley:我知道,我也从来没有期望得到一个完整的解决方案,但我坚持从问题中提到的问题开始,需要一些好的想法;你有吗?很好,从没听说过dict.setdefault()!这是添加元素的好方法。找到一些关于的描述,我将接受此作为答案。这并不能解决整个问题,但它让我走上了正确的道路。可以使用类似的程序删除条目。首先迭代到键/值,然后检查它们是否需要被删除,然后上升,这可以递归地解决。
    def handle_element(item, key, value, parent_list):
        if value:                              # 1.
            for parent in parent_list:
                item.setdefault(parent, {})    # 2. add the parent with empty dict
                item = item[parent]            # go further in the dict
            item[key] = value                  # 3.