Как показать наличие дубликатов в перечислении
У меня есть список статистики, который я храню для каждой команды в НФЛ. Каждую неделю у меня есть функция, которая проходит через всю лигу и, используя enumerate, ранжирует команды в каждой категории статистики, а затем сохраняет в базу данных.
Мой вопрос в том... если несколько команд имеют одинаковое значение, как мне присвоить им одинаковый ранг?
Например, если Патриоты и Гиганты набирают в среднем по 30 очков за игру и это лучший показатель в лиге, как мне сделать так, чтобы они оба заняли 1 место, а следующая команда начинала с 3 места?
Ниже я привожу, как я сейчас ранжирую команды. Я ценю любую помощь или советы, которые вы можете предложить.
for team in TeamName.objects.filter(league__name='NFL'):
for count, value in enumerate(NFLTeamStats.objects.all().values(
'name', 'avg_points').order_by(
'-avg_points'), start=1):
if value['name'] == team.pk:
avg_points_rank = count
Вы можете использовать функцию Window и Rank для аннотации каждой строки рангом, который увеличивается именно так, как вы описали
from django.db.models import F, Window
from django.db.models.functions import Rank
for stats in NFLTeamStats.objects.annotate(
rank=Window(expression=Rank(), order_by=F('avg_points').desc())
):
print(stats, stats.rank)
К сожалению, я не вижу способа настроить перечисление в этом случае. Вам придется хранить свой собственный счетчик и сравнивать с последним каждую итерацию:
rank = 0
last_points = -1
for value in NFLTeamStats.objects.all().values('name', 'avg_points').order_by('-avg_points')
if value['name'] == team.pk:
if value['avg_points'] > last_points:
rank += 1
avg_points_rank = rank
last_points = value['avg_points']