Задача «Результаты олимпиады»

Только начал изучать Python. Помогите, пожалуйста, решить задачу:

Условие:
Во время проведения олимпиады каждый из участников получил свой идентификационный номер — натуральное число. Необходимо отсортировать список участников олимпиады по количеству набранных ими баллов от больших баллов к меньшим, а при равенстве баллов — по возрастанию идентификационных номеров. Встроенные алгоритмы сортировки не использовать.

Входные данные:
На первой строке дано число ?(1≤?≤1000) — количество участников. На каждой следующей строке даны идентификационный номер и набранное число баллов соответствующего участника. Все числа во входном файле не превышают 105.

Выходные данные:
В выходной файл выведите исходный список в порядке убывания баллов. Если у некоторых участников одинаковые баллы, то их между собой нужно выводить в порядке возрастания идентификационных номеров.

Я пытался сам решить задачу, но в итоге ничего не получается.

Мой код:

n = int(input())
ipt = [[int(j) for j in input().split()] for i in range(n)]



for i in range(len(ipt)):
    imax = i
    if ipt[imax][1] < ipt[i][1]:
        ipt[imax], ipt[i] = ipt[i], ipt[imax]
    elif ipt[imax][1] == ipt[i][1]:
        if ipt[imax][0] > ipt[i][0]:
            ipt[imax], ipt[i] = ipt[i], ipt[imax]



for l in ipt:
    print(*l)

Помогите, пожалуйста, улучшить код.


Ответы (3 шт):

Автор решения: MBo

Причём тут квадраты сумм?

a[j]>tmp замените на функцию сравнения, учитывающую в первую очередь баллы, а при равенстве - номер.

Данные можно организовать в два списка и менять элементы одновременно, или в список туплей или списков - так проще.

def compare(a, b):
    if a[1] > b[1]:
        return True
    elif a[1] == b[1]:
        return a[0] > b[0]
    else:
        return False

def insertion_sort(f):
    for i in range(1, len(f)):
        tmp = f[i]
        j = i - 1
        while j >= 0 and compare(tmp, f[j]):
            f[j + 1] = f[j]
            j -= 1
        f[j + 1] = tmp

f = [[1,3], [2,8], [3,3], [4,5]]
insertion_sort(f)
print(f)

>>[[2, 8], [4, 5], [3, 3], [1, 3]]
→ Ссылка
Автор решения: Александр Королев

извините, но почему то ваш код считает не правильно допустим на вводе

3 3
3 1
4 4
2 3

вывод получиться

4 4
2 3
3 3
3 1
→ Ссылка
Автор решения: Александр Журавлев

Держите, ребята! P.S. В Сириусе код все тесты прошёл

N = int(input())
number = []
result = []
for i in range(N):
    Number, Result = map(int,input().split())
    number.append(Number)
    result.append(Result)
#Начальная сортировка по значениям
R1 = []
N1 = []
for i in range(N):
    index1 = number.index(min(number))
    N1.append(number[index1])
    number.pop(index1)
    R1.append(result[index1])
    result.pop(index1)
R2 = []
N2 = []
for i in range(N):
    index2 = R1.index(max(R1))
    N2.append(N1[index2])
    N1.pop(index2)
    R2.append(R1[index2])
    R1.pop(index2)
for i in range(N):
    print(N2[i],R2[i])
→ Ссылка