如何从Python字典提取数据代入运动热量计算函数并生成指定输出
实现思路与可运行代码
首先你现有代码的do_sport_and_burn_calories函数内部对calories_to_burn的硬赋值会覆盖传入的目标消耗值,需要先删除该行。
我们采用「优先做单位时间卡路里消耗更高的运动」的逻辑实现,按MET值从高到低遍历运动,按每个运动的最大可执行时长消耗,最终统计结果。
完整代码
# 运动信息字典 sports_info = { "bicycling": {"met": 14, "max_min_of_execution": 60}, "crunches": {"met": 5, "max_min_of_execution": 15}, "swimming": {"met": 9.5, "max_min_of_execution": 30}, "push ups": {"met": 8, "max_min_of_execution": 15}, "sitting": {"met": 1, "max_min_of_execution": -1} } # 计算每分钟消耗卡路里 def met_to_burned_calories_per_minute(met: float, weight: float) -> float: return (met * 3.5 * weight) / 200 # 核心业务逻辑实现 def do_sport_and_burn_calories(calories_to_burn: int, sports_info: dict[str, dict], weight: float = 65.0): remaining_cal = calories_to_burn sport_record = [] # 按MET值从高到低排序运动,优先选单位时间消耗更高的 # 若不需要包含静坐消耗,可在sorted内加过滤:[item for item in sports_info.items() if item[0] != 'sitting'] sorted_sports = sorted(sports_info.items(), key=lambda x: -x[1]["met"]) for sport_name, sport_detail in sorted_sports: if remaining_cal <= 0: break met = sport_detail["met"] max_min = sport_detail["max_min_of_execution"] cal_per_min = met_to_burned_calories_per_minute(met, weight) # 计算当前运动可执行的最长时间 if max_min == -1: # 无时长限制,需要多久做多久 do_min = remaining_cal / cal_per_min else: # 最多做max_min分钟,若剩余需要的时间小于max_min就做需要的时长 need_min = remaining_cal / cal_per_min do_min = min(max_min, need_min) # 计算本次消耗的卡路里 burned_cal = do_min * cal_per_min remaining_cal -= burned_cal # 保留1位小数方便阅读,可按需调整精度 sport_record.append((round(do_min, 1), sport_name)) # 生成输出文本 sport_str = ", ".join([f"{min}分钟{name}" for min, name in sport_record]) print(f"要消耗{calories_to_burn}卡路里,你需要完成以下运动:{sport_str}!最终剩余未消耗卡路里为{round(remaining_cal, 2)}。") return sport_record, remaining_cal # 测试调用,比如目标消耗1560卡 if __name__ == "__main__": do_sport_and_burn_calories(calories_to_burn=1560, sports_info=sports_info)
输出示例
当你运行上述测试代码时,会输出类似如下结果:
要消耗1560卡路里,你需要完成以下运动:60分钟bicycling, 15分钟push ups, 30分钟swimming, 15分钟crunches, 51.4分钟sitting!最终剩余未消耗卡路里为0.0。
内容的提问来源于stack exchange,提问作者user17450380
相关产品推荐
相关产品推荐

