请教一个问题,如何遍历并增减多重嵌套字典中的数据? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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

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

  •  
  •   haozi1986 Dec 31, 2020 2075 views
    This topic created in 1944 days ago, the information mentioned may be changed or developed.

    拿到了一份 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数目和原始数据根本对不上……

    求教一个方式……

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

    @Claar

    问题解决了,看来还是要好好休息保证一个清醒的头脑,之前脑袋糊成一团了,把问题想得过于复杂,睡了一觉之后一下子想明白了
    xuanbg
        4
    xuanbg  
       Jan 1, 2021
    递归就完了
    About     Help     Advertise     Blog     API     FAQ     Solana     3236 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 13:23 PVG 21:23 LAX 06:23 JFK 09:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86