You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按对象类型统计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}

原代码问题

  1. 未统计容器类型本身:只处理了非容器类型(str、int、float)的统计,完全漏掉了所有dict和list的计数
  2. 忽略list中的非dict元素:处理list时仅递归遍历其中的dict元素,导致list里的字符串等类型被遗漏
  3. 未统计字典的键:字典的键都是字符串,原代码只统计值的类型,没把这些键算入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:55:28