如何使用Python计算JSON文件中的数值平均值
用Python计算JSON文件中数值平均值的实现方案
你提供的JSON片段属于不完整结构,合法的完整JSON需要用大括号包裹根级的items数组,且所有数值字段(start/end/conf)当前存储为字符串格式,计算前需要先转为浮点型。以下方案全程使用Python内置标准库,无需额外安装第三方依赖。
实现思路
- 加载解析内容:使用内置
json模块读取本地JSON文件/解析JSON字符串,转换为Python可操作的字典结构 - 逐层遍历取值:先遍历外层
items数组提取条目级的start、end字段,再遍历每个条目下嵌套的alter子数组提取conf字段 - 异常兼容处理:将字符串格式的数值转为float类型,遇到字段缺失、值无法转为合法数值的脏数据直接跳过,避免程序中断
- 平均值计算:对收集到的所有有效数值求和后除以总个数,无有效数值时直接返回0,规避除零报错
完整实现代码
import json from typing import List def calc_json_numeric_avg(json_source: str, target_fields: List[str] = None, is_file: bool = True) -> float: # 默认计算start、end、conf三个字段的总平均值,可通过target_fields自定义要计算的字段 if target_fields is None: target_fields = ["start", "end", "conf"] all_valid_values = [] # 支持读取本地文件 或 直接解析JSON字符串 if is_file: with open(json_source, 'r', encoding='utf-8') as f: data = json.load(f) else: data = json.loads(json_source) # 遍历items数组 for item in data.get("items", []): # 提取item层级的start、end字段 for field in ["start", "end"]: if field in target_fields and field in item: try: all_valid_values.append(float(item[field])) except (ValueError, TypeError): continue # 提取嵌套在alter数组下的conf字段 if "conf" in target_fields: for alter_item in item.get("alter", []): if "conf" in alter_item: try: all_valid_values.append(float(alter_item["conf"])) except (ValueError, TypeError): continue # 无有效数值时直接返回0 if not all_valid_values: return 0.0 return sum(all_valid_values) / len(all_valid_values) # 调用示例 if __name__ == "__main__": # 计算本地JSON文件的平均值 avg_result = calc_json_numeric_avg("your_file_path.json") print(f"目标字段数值平均值: {avg_result:.2f}") # 如果要解析JSON字符串而非文件,按如下方式调用 # test_json_str = '{"items": [{"start": "0.6", "end": "0.9", "alter": [{"conf": "0.6", "content": ""}], "type": "pron"}]}' # avg_result = calc_json_numeric_avg(test_json_str, is_file=False)
使用说明
- 计算本地文件时,把
your_file_path.json替换为实际的JSON文件存储路径即可 - 若只需要计算单个字段的平均值,比如单独统计
conf字段的平均,调用时传入参数target_fields=["conf"]即可 - 要确保待处理的JSON是合法格式,根结构必须是包裹
items数组的对象,即完整结构为{"items": [数组内容]},否则会触发解析错误
内容的提问来源于stack exchange,提问作者imhere
相关产品推荐
相关产品推荐

