因此,作为序言:我对编码和python还是很陌生,所以请您原谅我,不知道“他在想什么?”。
我正在教程之外的第一个实际项目中工作,我正在尝试创建一个锻炼计划器,特别是5/3/1。这是一个程序,它占用您单次最大收益的90%,并根据该值的不同百分比提供程序。
我目前正在/正在坚持的工作是创建一个嵌套字典来表示一个月内的锻炼。一个月有4次锻炼,每个锻炼有3套。每个集合是self.training_max
值的百分比。所有这些值都存储在self.weights
列表中。
我最后想要的是一个像这样的字典:{'Week 1': {'Set 1': 60, 'Set 2': 69, 'Set 3': 78}, 'Week 2': {'Set 1': 'Set 1': 64, 'Set 2': 74, 'Set 3': 83}}
等。
如果运行它,您会看到我已经很近了,但是我使用.create_workout()
方法更新字典的方式存在问题。我添加了打印语句来帮助我跟踪递归,并且在正确的时间调用了正确的值,但是当将它们添加到字典中时,它们将作为父字典的每个单个值添加。
因此,到最后,所有四周的集合都具有相同的值,因为每次调用change_value()
时它们都会被覆盖。
我想念什么?我也非常愿意就您看到的任何其他问题提供任何其他反馈,就像我说的那样,我对此仍然很陌生。
import math
class exercise:
def __init__(self, name, reps, weight, unit='kg', weeks=4, sets=3):
self.name = name.title()
self.reps = reps
self.weight = weight
self.one_rep = math.floor(self.weight * (1 + (self.reps / 30)))
self.training_max = math.floor(self.one_rep * .90)
self.unit = unit
self.percentages = [.65, .75, .85, .70, .80, .90, .75, .85, .95, .40, .50, .60]
self.weights = [round (percentage * self.training_max) for percentage in self.percentages]
self.weeks_list = ['Week ' + str(week + 1) for week in range(weeks)]
self.sets_dict = {"Set " + str(set + 1): 0 for set in range(sets)}
self.workout_dict = {week: self.sets_dict for week in self.weeks_list}
def create_workout_2(self):
def change_val(dictionary_this, i_this):
for key, weight in zip(dictionary_this.keys(), self.weights[i_this: i_this + 3]):
print (f'Key = {key}. Weight = {weight}')
dictionary_this[key] = weight
return dictionary_this
i = -3
for week in self.workout_dict.keys():
i+= 3
print (f'\nFor loop: This is {week}, i_this is {i}, weights are {self.weights[i : i + 3]}, they key being used is {week}')
self.workout_dict[week] = change_val(self.workout_dict[week], i)
print (f'The values for {week} are {self.workout_dict[week]}')
return self.workout_dict
squat_workout = squat.create_workout_2()
print (f'\nsquat.weights = {squat.weights}')
print (f'\nFinal squat_workout output= {squat_workout}')
答案 0 :(得分:0)
您的问题是您每周使用相同的self.sets_dict
。因此,当您在不同星期更新程序时,更改将应用于所有周。您需要确保每周都有唯一的sets_dict
。
不要重复使用相同的命令,而是每周复制一份。要进行复制,您可以导入copy
模块并使用copy.copy
(在某些情况下不是,但是应该使用copy.deepcopy
)。但是,获取浅表副本(即copy.copy
)的另一种方法是将数据结构传递给其构造函数。这样做可以消除将import copy
添加到文件中的要求。它不太笼统,但在可能的情况下,我觉得更清晰。
因此,您要做的就是更改
self.workout_dict = {week: self.sets_dict for week in self.weeks_list}
到
self.workout_dict = {week: dict(self.sets_dict) for week in self.weeks_list}
,该代码将按您期望的方式工作。我想再增加一件事。无需将在类的方法中使用的所有变量都声明为self...
,而仅需要在方法之间记住这些变量。在您的情况下,无需使用self.percentages, self.week_list, self.sets_dict
。最好只使用percentages, weeks_list, sets_dict
而不使用self.
(sets_dict
似乎需要保留,但是(副本)已经存储在self.workout_dict
中,所以没有需要直接访问。)