如何按对象类型统计JSON结构类型数量?修复代码统计不全问题
修复嵌套数据结构的类型统计代码
测试输入数据
object = {'name': 'John', 'age': 30, 'address': {'street': '123 Main St', 'city': 'Sampletown', 'zipcode': '12345', 'frequency': 12.55}, 'interests': ['Python programming', {'hobbies': ['Playing chess', {'outdoor': {'activity1': 'Hiking', 'activity2': 'Cycling'}}]}], 'friends': [{'name': 'Alice', 'age': 28}, {'name': 'Bob', 'age': 32, 'hobbies': ['Hiking', 'Reading']}]}
期望输出
{"str": 30, "dict": 6, "list": 4, "int": 3, "float": 1}
原代码问题
- 未统计容器类型本身:只处理了非容器类型(str、int、float)的统计,完全漏掉了所有
dict和list的计数 - 忽略list中的非dict元素:处理list时仅递归遍历其中的dict元素,导致list里的字符串等类型被遗漏
- 未统计字典的键:字典的键都是字符串,原代码只统计值的类型,没把这些键算入str的数量
修复后的代码
from collections import Counter def get_the_type(o): # 先统计当前对象的类型 if isinstance(o, dict): yield 'dict' # 遍历字典键值对,统计键的类型(均为str)并递归处理值 for key, val in o.items(): yield type(key).__name__ yield from get_the_type(val) elif isinstance(o, list): yield 'list' # 遍历列表所有元素,递归处理每一项 for item in o: yield from get_the_type(item) else: # 非容器类型直接统计其类型名称 yield type(o).__name__ final_dict = dict(Counter(get_the_type(object))) print(final_dict)
代码说明
- 统计容器类型:遇到dict或list时,先输出对应的类型名称,再递归处理内部元素,确保所有容器都被计数
- 完整处理list元素:不再过滤list中的元素类型,所有元素都递归统计,避免遗漏字符串等类型
- 包含字典键的统计:遍历字典键值对时,单独统计键的类型(都是str),补上这部分字符串数量
- 全层级递归:不管嵌套多少层,所有元素的类型都会被统计到
运行后输出与期望完全一致:{'str': 30, 'dict': 6, 'list': 4, 'int': 3, 'float': 1}
内容的提问来源于stack exchange,提问作者VERBOSE
相关产品推荐
相关产品推荐

