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

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')
关键逻辑说明
  1. 精准筛选Exit记录:先过滤出课程下targetTitle为"Exit"的记录,减少无效检查。
  2. 全集校验机制:利用集合的issuperset()方法,严格判断当前Exit记录的pTitle是否包含所有指定元素,确保只有"全部满足+Exit"的情况才会被判定为完成。
  3. 状态映射与导出:以「参与者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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:52:38