我有一个关于迭代的相当noob问题,我似乎无法正确。
我有一个表,其中包含用户完成的每个月度测试的记录,如果他们错过了一个月,那么表中没有记录。
我想从表格中提取用户历史记录,然后在12个月中的每个月设置Y或N作为其完成状态。
这是我的代码:
def getSafetyHistory(self, id):
results = []
safety_courses = UserMonthlySafetyCurriculums.objects.filter(users_id=id).order_by('month_assigned')
for i in range(1, 13):
for s in safety_courses:
if s.month_assigned == i:
results.append('Y')
else:
results.append('N')
return results
所以我的理想结果将是一个包含12个条目的列表,Y或N. 即结果= [N,N,Y,N,N,Y,Y,Y,N,N,N,Y]
上面的查询为用户返回2条记录,这是正确的,但在我的迭代中,我总是得到24个条目,显然是由于外部和内部循环,但我不确定我应该做的“pythonic”方式这没有大量的嵌套循环。
答案 0 :(得分:1)
可能有很多方法可以做到这一点。这是一个想法。
看起来您只会获得已完成课程的记录。所以你可以预先建立一个包含12个结果的列表,所有结果都设置为no。然后在查询数据库之后,将那些数据库翻转为“是”,这与您获得的结果相对应。
results = ['N'] * 12 # prebuild results to all no
safety_courses = UserMonthlySafetyCurriculums.objects.filter(
users_id=id).order_by('month_assigned')
for course in safety_courses:
results[course.month_assigned - 1] = 'Y'
这假设month_assigned
是1到12之间的整数,正如您的代码提示的那样。