Как показать наличие дубликатов в перечислении

У меня есть список статистики, который я храню для каждой команды в НФЛ. Каждую неделю у меня есть функция, которая проходит через всю лигу и, используя 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']
Вернуться на верх