Задача «Результаты олимпиады»
Только начал изучать 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 шт):
Причём тут квадраты сумм?
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])