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

2020-12-31 21:27:11 +08:00
 haozi1986

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

求教一个方式……

1654 次点击
所在节点    Python
4 条回复
lithbitren
2021-01-01 00:40:45 +08:00
搜索启蒙题啊。。
Claar
2021-01-01 05:43:56 +08:00
我觉得应该要先理清逻辑,这个多层结构的优先顺序很重要,从上面的描述里我没看出来关于这部分的描述。你可以把数据直接批量改一下丢来我试试,或者来一个完整结构的最少 3 层的例子,我有点想写写
haozi1986
2021-01-01 05:53:13 +08:00
@lithbitren

@Claar

问题解决了,看来还是要好好休息保证一个清醒的头脑,之前脑袋糊成一团了,把问题想得过于复杂,睡了一觉之后一下子想明白了
xuanbg
2021-01-01 19:08:38 +08:00
递归就完了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/740764

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX