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

Python嵌套循环工时统计问题:总工时累加错误与输出优化需求

Python研究助理工时统计问题修正

我们需要实现的功能是:收集3名研究助理5个工作日的工时数据,计算每人的周总工时,若日均工时超过6小时则进行标记,并且要求先完成所有输入收集,再统一输出结果。

原代码问题分析

原代码尝试用嵌套循环实现,但存在三个核心问题:

  • 全局变量hoursWorked未在每个助理的统计循环中重置,导致不同助理的工时持续累加,无法得到个体独立总工时
  • 平均值计算基于累加的全局总工时,而非当前助理的独立工时,结果完全错误
  • 原代码每收集完一个助理的数据就立即输出,不符合“先收集所有输入再统一输出”的要求

原代码

hoursWorked = 0
researchAssistants = 3
        
for assisstant in range(researchAssistants):
    for day in range(5):
        if day == 0:
            hoursWorked += float(input("Enter hours for research assistant {0} for Day 1: ".format(assisstant+1)))
        if day == 1:
            hoursWorked += float(input("Enter hours for research assistant {0} for Day 2: ".format(assisstant+1)))
        if day == 2:
            hoursWorked += float(input("Enter hours for research assistant {0} for Day 3: ".format(assisstant+1)))
        if day == 3:
            hoursWorked += float(input("Enter hours for research assistant {0} for Day 4: ".format(assisstant+1)))
        if day == 4:
            hoursWorked += float(input("Enter hours for research assistant {0} for Day 5: ".format(assisstant+1)))
    print()
    print("Research assistant {0} worked in total".format(assisstant+1), hoursWorked, "hours")
    avgHoursWorked = hoursWorked / 5
    if avgHoursWorked > 6:
        print("Research assistant {0} has an average number of hours per day above 6".format(assisstant+1) )
    print()

原代码错误输出示例

Enter hours for research assistant 1 for Day 1: 5
Enter hours for research assistant 1 for Day 2: 5
Enter hours for research assistant 1 for Day 3: 5
Enter hours for research assistant 1 for Day 4: 5
Enter hours for research assistant 1 for Day 5: 5

Research assistant 1 worked in total 25.0 hours 

Enter hours for research assistant 2 for Day 1: 5
Enter hours for research assistant 2 for Day 2: 5
Enter hours for research assistant 2 for Day 3: 5
Enter hours for research assistant 2 for Day 4: 5
Enter hours for research assistant 2 for Day 5: 5

Research assistant 2 worked in total 50.0 hours
Research assistant 2 has an average number of hours per day above 6

Enter hours for research assistant 3 for Day 1: 5
Enter hours for research assistant 3 for Day 2: 5
Enter hours for research assistant 3 for Day 3: 5
Enter hours for research assistant 3 for Day 4: 5
Enter hours for research assistant 3 for Day 5: 5

Research assistant 3 worked in total 75.0 hours
Research assistant 3 has an average number of hours per day above 6

修正后的代码

我们用列表存储每个助理的独立总工时,拆分数据收集和结果输出两个阶段,同时简化冗余的输入逻辑:

# 定义基础参数
num_assistants = 3
num_days = 5
# 存储每个助理的周总工时
total_hours_list = []

# 第一阶段:收集所有工时数据
for assistant_idx in range(num_assistants):
    daily_total = 0  # 每个助理的工时单独统计,每次循环重置
    print(f"请输入第{assistant_idx+1}名研究助理的工时:")
    for day_idx in range(num_days):
        hours = float(input(f"第{day_idx+1}天的工时:"))
        daily_total += hours
    # 将当前助理的总工时存入列表
    total_hours_list.append(daily_total)

# 第二阶段:统一输出统计结果
print("\n===== 工时统计结果 =====")
for idx, total_hours in enumerate(total_hours_list):
    assistant_num = idx + 1
    avg_hours = total_hours / num_days
    print(f"第{assistant_num}名研究助理周总工时:{total_hours:.1f}小时")
    if avg_hours > 6:
        print(f"⚠️ 第{assistant_num}名研究助理日均工时超过6小时")
    print()

修正说明

  1. 使用列表total_hours_list存储每个助理的独立总工时,彻底解决全局变量累加问题
  2. 每个助理的循环内初始化daily_total = 0,保证个体工时从0开始统计
  3. 简化内层循环的输入逻辑,用day_idx+1直接生成天数,去掉冗余的if判断
  4. 明确拆分数据收集和结果输出两个阶段,满足先收集再统一输出的需求
  5. 优化输出格式,增加分隔线和标记符号,提升可读性

修正后运行示例

输入所有日均5小时的情况

请输入第1名研究助理的工时:
第1天的工时:5
第2天的工时:5
第3天的工时:5
第4天的工时:5
第5天的工时:5
请输入第2名研究助理的工时:
第1天的工时:5
第2天的工时:5
第3天的工时:5
第4天的工时:5
第5天的工时:5
请输入第3名研究助理的工时:
第1天的工时:5
第2天的工时:5
第3天的工时:5
第4天的工时:5
第5天的工时:5

===== 工时统计结果 =====
第1名研究助理周总工时:25.0小时

第2名研究助理周总工时:25.0小时

第3名研究助理周总工时:25.0小时

输入某助理日均7小时的情况

...
===== 工时统计结果 =====
第1名研究助理周总工时:35.0小时
⚠️ 第1名研究助理日均工时超过6小时

第2名研究助理周总工时:25.0小时

第3名研究助理周总工时:25.0小时

内容的提问来源于stack exchange,提问作者wiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:05:16