V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
haozi1986
V2EX  ›  Python

请教一个问题,如何遍历并增减多重嵌套字典中的数据?

  •  
  •   haozi1986 · 2020-12-31 21:27:11 +08:00 · 1593 次点击
    这是一个创建于 1228 天前的主题,其中的信息可能已经有所发展或是发生改变。

    拿到了一份 JSON 的历史数据,需要按规则增减一部分内容,规则比较简单,因为数据不能提供出来,我只能尽可能解释一下。

    同级别下,type_class 中定义了 ABC 等变量当前有效数据位于哪一个集合中,如果A的值为1,则同一层级中cache_one中的A的键值就是A的有效数据,如果值为2,则有效数据是放置在cache_two中,但如果值为0,则这个名称的数据会返回为,不管它是不是在cache_onecache_two中有数据

    用 JSON 的某一个块来举例:

    ...
    "type_class": {
    	"A": 1,
    	"B": 2,
    	"C": 0,
    	...
    	"E": 2,
    	"F": 3
    },
    "cache_one": {
    	"A": 55,
    	"B": 12,
    	"C": 27,
    	...
    	"E":14,
    	"F": 3
    },
    "cache_two": {
    	"A": 32,
    	"B": 99,
    	"C": 2
    	...
    	"E": 0
    },
    "cache_three": {
    	"A": 51
    	"B": 6,
    	...
    	"F": 127
    }
    ...
    

    如果我要返回A的值,那么就应该是取cache_one中的A的值,也就是55

    返回B的值,取cache_two中的B值,99

    返回C的值,为

    返回F的值,取cache_three中的F值,127

    这套数据的存储大概就是这么个形式。

    现在需要对这些数据进行清理,使得最终的输出变为(如果返回的键值为0,一样需要清理,比如上面的E,定义在cache_two中,键值为0,则最终的输出会把它剔除):

    	...
    	"type_class": {
    		"A": 1,
    		"B": 1,
    		"F": 1
    	},
    	"cache_one": {
    		"A": 55
    		"B": 99,
    		"F":127
    	},
    	"cache_two": {
    	},
    	"cache_three": {
    	}
    	...
    

    我本以为跑几次循环就能够解决问题了,结果没想到这个 JSON 文件还有多层嵌套,它的形式差不多如下:

    (下面出现XY仅供示意,代表乱七八糟的各种内容,这些内容需要保留)

    {
        "type_class": {
            "A": 1,
            "B": 2,
            "C": 0,
            ...
            "F": 3
        },
        "type_one": {
            "A": 55,
            "B": 12,
            "C": 27,
            "F": 3
        },
        "type_two": {
            "A": 32,
            "B": 99,
            "C": 2
        },
        "type_three": {
            "A": 51
            "B": 6,
            "F": 127
        },
        "XXXXXX": {
            "XXXX": "XXXXXXX",
            "YYY": "YYYYY"
        },
        "YYYY": "YYYYY",
    	"XXXX": "XXXXXXX",
        "history_items": [{
                "type_class": {
                    "A": 1,
                    "F": 0
                },
                "type_one": {
                    "A": 55
                },
                "type_two": {
                    "A": 32,
                }
                "XXXXXX": {
                    "YYY": "YYYYY"
                }
            }, {
                "type_class": {
                    "F": 3
                },
                "type_three": {
                    "A": 51
                    "B": 6,
                    "F": 127
                },
                "XXXXXX": {
                    "XXXX": "XXXXXXX",
                    "YYY": "YYYYY"
                },
                "YYYY": "YYYYY",
                "history_items": [{
                        "type_class": {
                            "A": 1,
                            "B": 2,
                            "C": 0,
                            ...
                            "F": 0
                        },
                        "type_one": {
                            "A": 55,
                            "B": 12,
                            "C": 27,
                            "F": 3
                        },
                        "type_two": {
                            "A": 32,
                            "B": 99,
                            "C": 2
                        }
                        "XXXXXX": {
                            "XXXX": "XXXXXXX",
                            "YYY": "YYYYY"
                        }
                    }
                ]
            }
        ]
    }
    

    我现在头都大了,这个 JSON 里面大概有上万个type_class,字典里有数组,数组里又有字典,最深的嵌套层级可能有个十几级,今天折腾了快一天,把我知道的方式都试过了,但最终输出的数据里的type_class数目和原始数据根本对不上……

    求教一个方式……

    第 1 条附言  ·  2021-01-01 05:54:16 +08:00
    已解决
    看来还是不要加班熬夜,容易降低效率影响思维方式
    4 条回复    2021-01-01 19:08:38 +08:00
    lithbitren
        1
    lithbitren  
       2021-01-01 00:40:45 +08:00
    搜索启蒙题啊。。
    Claar
        2
    Claar  
       2021-01-01 05:43:56 +08:00 via iPhone
    我觉得应该要先理清逻辑,这个多层结构的优先顺序很重要,从上面的描述里我没看出来关于这部分的描述。你可以把数据直接批量改一下丢来我试试,或者来一个完整结构的最少 3 层的例子,我有点想写写
    haozi1986
        3
    haozi1986  
    OP
       2021-01-01 05:53:13 +08:00 via Android
    @lithbitren

    @Claar

    问题解决了,看来还是要好好休息保证一个清醒的头脑,之前脑袋糊成一团了,把问题想得过于复杂,睡了一觉之后一下子想明白了
    xuanbg
        4
    xuanbg  
       2021-01-01 19:08:38 +08:00
    递归就完了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4651 人在线   最高记录 6547   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:11 · PVG 18:11 · LAX 03:11 · JFK 06:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.