Я бы просто использовал itertools.groupby
. Что-то вроде:
top_users = [(k, list(g)) for k,g in groupby(top_users, key=lambda x: x.score))]
for u in top_users[0][1]:
u.status = 'First prize'
for u in top_users[1][1]:
u.status = 'Second prize'
for u in top_users[2][1]:
u.status = 'Third prize'
for score, users in top_users[3:]:
for u in users:
u.status = 'Highly recommended'
Или, что еще лучше, используйте itertools.count
вместо 4 циклов:
top_users = [(k, list(g)) for k,g in groupby(top_users, key=lambda x: x.score))]
for c, (score, group) in zip(count(0), top_users):
if c == 0:
prize = 'First prize'
elif c == 1:
prize = 'Second prize'
elif c == 2:
prize = 'Third prize'
else:
prize = 'Highly recommended'
map(lambda x: setattr(x, 'status', prize), group)
И последнее уточнение, возможно, сохранить список призов вместо операторов if.
top_users = [(k, list(g)) for k,g in groupby(top_users, key=lambda x: x.score))]
prize_list = ['First prize', 'Second prize', 'Third prize', 'Highly recommended']
for c, (score, group) in zip(count(0), top_users):
prize = prize_list[c] if c < len(prize_list) else prize_list[-1]
map(lambda x: setattr(x, 'status', prize), group)
Предложением этого подхода является то, что вы не выполняете группировку в базе данных, а вместо этого делаете это в памяти. Это может быть проблемой, если есть много пользователей. См. Как сделать запрос как GROUP BY в django? , чтобы узнать, как это сделать в базе данных.