Python脚本优化:实现JSON数据的课程完成度精准判定
问题分析
你需要判定参与者是否完成课程的核心逻辑是:对应课程下必须存在一条targetTitle为"Exit"的记录,且该记录的pTitle包含全部指定元素(hard、easy、medium、CD、CH、WU)。原脚本的问题在于未校验"全部元素"这个核心条件,仅检查了单个元素匹配,导致两种情况无法区分。
优化后的Python脚本
import json import csv # 定义必须包含的元素集合 REQUIRED_ELEMENTS = {'hard', 'easy', 'medium', 'CD', 'CH', 'WU'} def check_course_completion(participant_data): completion_map = {} for participant in participant_data: pid = participant['participantId'] courses = participant.get('courses', []) for course in courses: cid = course['courseId'] # 筛选当前课程下所有targetTitle为Exit的记录 exit_records = [r for r in course.get('records', []) if r.get('targetTitle') == 'Exit'] is_completed = False # 遍历Exit记录,检查是否有一条包含全部必需元素 for record in exit_records: p_title_content = record.get('pTitle', '') # 提取pTitle中的元素(假设以空格分隔,可根据实际格式调整) present_elements = set(p_title_content.split()) # 用集合超集判断是否包含全部元素 if present_elements.issuperset(REQUIRED_ELEMENTS): is_completed = True break completion_map[(pid, cid)] = is_completed return completion_map def export_completion_to_csv(completion_map, output_file): with open(output_file, 'w', newline='', encoding='utf-8') as f: writer = csv.DictWriter(f, fieldnames=['participantId', 'courseId', 'completed']) writer.writeheader() for (pid, cid), status in completion_map.items(): writer.writerow({ 'participantId': pid, 'courseId': cid, 'completed': 'Yes' if status else 'No' }) # 实际使用示例 if __name__ == '__main__': # 加载你的JSON数据文件 with open('your_data.json', 'r', encoding='utf-8') as f: data = json.load(f) result = check_course_completion(data) export_completion_to_csv(result, 'course_completion_result.csv')
关键逻辑说明
- 精准筛选Exit记录:先过滤出课程下
targetTitle为"Exit"的记录,减少无效检查。 - 全集校验机制:利用集合的
issuperset()方法,严格判断当前Exit记录的pTitle是否包含所有指定元素,确保只有"全部满足+Exit"的情况才会被判定为完成。 - 状态映射与导出:以「参与者ID-课程ID」为键存储完成状态,最终导出为符合要求的CSV格式。
示例验证
假设你有如下示例JSON数据:
[ { "participantId": "P001", "courses": [ { "courseId": "C001", "records": [ {"targetTitle": "Exit", "pTitle": "hard easy medium CD CH WU"}, {"targetTitle": "Lesson", "pTitle": "hard easy"} ] } ] }, { "participantId": "P002", "courses": [ { "courseId": "C001", "records": [ {"targetTitle": "Exit", "pTitle": "hard"}, {"targetTitle": "Exit", "pTitle": "easy"} ] } ] } ]
运行脚本后生成的CSV输出为:
participantId,courseId,completed P001,C001,Yes P002,C001,No
完全符合判定要求:P001满足全部元素+Exit,标记为完成;P002仅单个元素+Exit,标记为未完成。
适配调整提示
- 如果
pTitle的元素分隔符不是空格(比如逗号、分号),修改p_title_content.split()中的分隔符参数即可。 - 如果JSON数据结构有嵌套差异,可根据实际情况调整
participant、course、records的取值路径。
内容的提问来源于stack exchange,提问作者Sentient Onion
相关产品推荐
相关产品推荐

