Найти - Пользователи
Полная версия: Решение задачи по массивам (МФТИ)
Начало » Python для новичков » Решение задачи по массивам (МФТИ)
1 2 3 4
KEKIs
py.user.next
Почему не предполагает?
Потому что идет в контексте лекций, где работа ведется только со списками. Спасибо за ответ. Буду разбираться!
py.user.next
KEKIs
Потому что идет в контексте лекций, где работа ведется только со списками.
Значит, надо без словаря делать, на одних списках.

Поковырял, кстати, твой “рабочий” код, так как он показался мне каким-то подозрительным
KEKIs
  
#Способ 2, рабочий
results = [(0, 3), (0, 10), (2, 3), (2, 2), (2, 4)]
results = sorted(results, key=lambda x: x[1], reverse=True)
results = sorted(results, key=lambda x: sum([k[1] for k in results if k[0] == x[0]]), reverse=True)
print(results) #[(0, 10), (0, 3), (2, 4), (2, 3), (2, 2)]
и предчувствие меня не обмануло
  
>>> results = [(0, 3), (2, 3), (0, 14), (2, 10), (3, 5), (2, 4)]
>>> results = sorted(results, key=lambda x: x[1], reverse=True)
>>> results = sorted(results, key=lambda x: sum([k[1] for k in results if k[0] == x[0]]), reverse=True)
>>> print(results)
[(0, 14), (2, 10), (2, 4), (0, 3), (2, 3), (3, 5)]
>>>
Так что можешь переделывать его, не сделал ты его.
KEKIs
py.user.next
Это интересно…

Я сдавал в итоге код с такой сортировкой:
 results = sorted(results, key=lambda x: x[1], reverse=True)
results = sorted(results, key=lambda x: x[0])
results = sorted(results, key=lambda x: sum([k[1] for k in results if k[0] == x[0]]), reverse=True)

Среднюю часть добавил, потому что в проверках были примеры, где из студентов с одинаковыми суммами оценок первым выводился тот, у которого id меньше, а не тот, который первый во входных данных встретился. Но в итоге все тесты он прошел и на массиве, который ты предлагаешь тоже работает корректно. Только я не могу понять, почему…

Как проверить? В дебагере не отражается процесс сортировки и вычисления lambda. Подскажите, как быть?
py.user.next
KEKIs
  
results = sorted(results, key=lambda x: sum([k[1] for k in results if k[0] == x[0]]), reverse=True)
А что будет, если там будет миллион оценок с идентификатором 0 ? Он для этого миллиона оценок будет миллион раз вычислять одну и ту же сумму? Надо переделать это.

Сначала надо получить пары.
Затем сортировка всех пар должна пройти по первой колонке.
Затем по первой колонке нужно получить пары (идентификатор, список значений).
Затем сортировка полученных пар должна пройти по суммам из списков значений.
Затем полученные пары должны быть выведены.

А если наскоряк пытаешься сделать в три строчки, то в итоге несколько раз переписываешь код и в конце всё равно приходишь к результату, который и нужно было сделать изначально.

KEKIs
В дебагере не отражается процесс сортировки
Если тебе понадобился дебаггер, значит ты делаешь что-то не то. В данном случае ты пытаешься неправильный код в три строчки натянуть на тесты. Это неправильный подход. Надо правильно писать программы. А правильная программа - это программа, в которой правильный код. Или ты думаешь, что программы пишутся для того, чтобы тесты проходить какие-то? Программы пишутся для того, чтобы работать потом годами. А работать они должны правильно и надёжно.
KEKIs
py.user.next
Да я ж вроде вопрос не про это задал. Я хочу понять, как работает функция sorted и в какой момент она делает не то, что я ожидаю.
Я не спорю, что код не оптимальный, но мы вроде в топике Python для новичков. Естественно, я делаю какие-то ошибки, невозможно сразу научиться писать идеально.
И я не понимаю, почему ты думаешь, что я что-то на что-то натягиваю. Я написал, что вторая сортировка родилась не потому, что код неправильно работал, а потому что в проверке были требования к входным данным, которые не описаны в условии. Там нет ни слова про выводить студентов в порядке возрастания id при равенстве сумм баллов.
Буду признателен, если объяснишь, как залезть в работу sorted. То, что код написан по твоему мнению отвратительно, я уже понял, это можно не повторять.
py.user.next
KEKIs
Но в итоге все тесты он прошел и на массиве, который ты предлагаешь тоже работает корректно.
Он работает корректно на этом массиве потому, что тесты неправильные. В интерпретаторе питона без всяких тестов этот код явно неправильно работает.
Можешь писать письма автору тестов https://t.me/tkhirianov , но лучше найди группу, где толпы учеников обсуждают задания.
Одна из групп https://t.me/ege_tkhirianov

В самомзадании говорится, что студентов надо выводить целиком. Также в задании ничего не говорится о том, что они подаются правильно и только друг за другом.

KEKIs
Буду признателен, если объяснишь, как залезть в работу sorted.
Открой исходники питона и там найди эту функцию.
https://github.com/python/cpython

Функция sorted() для списка реализована через list.sort()
Функция list.sort() сортирует через mergesort
https://github.com/python/cpython/blob/main/Objects/listobject.c#L2312

Выкладки из разных обсуждений о лучшей сортировке для списка идут в файле listsort.txt
https://github.com/python/cpython/blob/main/Objects/listsort.txt
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB