如何从Python字典指定分组中获取多个随机值生成健身训练组
代码问题原因
random.sample()传参错误:你代码中调用了.items()方法,但musclegroup_exercises中每个肌群对应的值是集合类型,只有字典才有items()方法,直接传入动作集合本身即可- 函数逻辑未完成:
createworkout2仅写了前半段,没有实现第二个肌群的动作抽取、结果汇总输出逻辑 - 单肌群训练函数未实现随机抽取:现有
createworkout1会输出对应肌群的所有动作,不符合随机选动作的需求 - 随机库导入位置不合理:放在函数内部会导致每次调用函数都重复执行导入操作
修复后完整代码
import random musclegroup_exercises = { 'legs': {"squat", "calf raises", "hamstring curls", "deadlifts", "walking lunges"}, 'chest': {"barbell bench", "pushups", "cable fly", "dumbbell fly", "dumbbell incline bench press"}, 'arms': {"bicep curls", "kickbacks", "tricep pushdown", "reverse curls", "hammer curl"}, 'shoulders':{"shoulder press", "lateral raise", "barbell shrug", "bent over reverse flys", "push press"}, 'back':{"dumbbell rows", "back extension", "pull ups", "lat pull downs", "machine seated row"}, 'core':{"sit ups", "crunches", "russian twists", "bicycles", "planks"}, } print('可选目标肌群:Legs, Chest, Arms, Shoulders, Back, Core') print('可选强度等级:Easy, Medium, Hard') # 输入校验 while True: try: num = int(input('请选择训练的目标肌群数量(1或2):')) if num in (1,2): break print('请输入1或2') except ValueError: print('请输入有效数字') target_groups = [] if num == 1: while True: musclegroup = input('请输入目标肌群名称:').lower() if musclegroup in musclegroup_exercises: target_groups.append(musclegroup) break print('输入的肌群不存在,请重新输入') else: while len(target_groups) < 2: tip = '请输入第一个目标肌群名称:' if len(target_groups) == 0 else '请输入第二个目标肌群名称:' mg = input(tip).lower() if mg in musclegroup_exercises and mg not in target_groups: target_groups.append(mg) elif mg in target_groups: print('该肌群已选择,请输入其他肌群') else: print('输入的肌群不存在,请重新输入') while True: intensity = input('请选择强度等级:').capitalize() if intensity in ('Easy', 'Medium', 'Hard'): break print('请输入有效强度等级:Easy/Medium/Hard') rate_map = {'Easy':'65%', 'Medium':'80%', 'Hard':'90%'} rate = rate_map[intensity] # 生成训练计划 workout = [] for group in target_groups: # 每个肌群随机抽3个动作 exercises = random.sample(list(musclegroup_exercises[group]), 3) workout.extend(exercises) print(f'\n你的专属训练计划(强度对应负荷:{rate}):') for idx, act in enumerate(workout, 1): print(f'{idx}. {act}')
修改说明
- 增加了全流程输入校验,避免用户输入无效值导致程序崩溃
- 修复了
random.sample的传参错误,先将动作集合转为列表再传入即可完成随机抽取 - 简化了训练计划生成逻辑,兼容1个/2个肌群的场景,无需写两个独立函数
- 优化了输出格式,按序号展示训练动作,同时标注对应强度的负荷参考值
内容的提问来源于stack exchange,提问作者Fernando Toledo
相关产品推荐
相关产品推荐

