Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 20, 2022 22:44:26

KEKIs
Зарегистрирован: 2022-06-10
Сообщения: 9
Репутация: +  -1  -
Профиль   Отправить e-mail  

Решение задачи по массивам (МФТИ)

py.user.next
Почему не предполагает?
Потому что идет в контексте лекций, где работа ведется только со списками. Спасибо за ответ. Буду разбираться!

Отредактировано KEKIs (Июнь 20, 2022 22:48:18)

Офлайн

#2 Июнь 21, 2022 04:09:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9731
Репутация: +  843  -
Профиль   Отправить e-mail  

Решение задачи по массивам (МФТИ)

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)]
>>>
Так что можешь переделывать его, не сделал ты его.



Отредактировано py.user.next (Июнь 21, 2022 04:13:24)

Офлайн

#3 Июнь 22, 2022 13:42:19

KEKIs
Зарегистрирован: 2022-06-10
Сообщения: 9
Репутация: +  -1  -
Профиль   Отправить e-mail  

Решение задачи по массивам (МФТИ)

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. Подскажите, как быть?

Отредактировано KEKIs (Июнь 22, 2022 13:42:57)

Офлайн

#4 Июнь 22, 2022 20:46:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9731
Репутация: +  843  -
Профиль   Отправить e-mail  

Решение задачи по массивам (МФТИ)

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

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

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

KEKIs
В дебагере не отражается процесс сортировки
Если тебе понадобился дебаггер, значит ты делаешь что-то не то. В данном случае ты пытаешься неправильный код в три строчки натянуть на тесты. Это неправильный подход. Надо правильно писать программы. А правильная программа - это программа, в которой правильный код. Или ты думаешь, что программы пишутся для того, чтобы тесты проходить какие-то? Программы пишутся для того, чтобы работать потом годами. А работать они должны правильно и надёжно.



Отредактировано py.user.next (Июнь 22, 2022 20:49:22)

Офлайн

#5 Июнь 22, 2022 21:12:48

KEKIs
Зарегистрирован: 2022-06-10
Сообщения: 9
Репутация: +  -1  -
Профиль   Отправить e-mail  

Решение задачи по массивам (МФТИ)

py.user.next
Да я ж вроде вопрос не про это задал. Я хочу понять, как работает функция sorted и в какой момент она делает не то, что я ожидаю.
Я не спорю, что код не оптимальный, но мы вроде в топике Python для новичков. Естественно, я делаю какие-то ошибки, невозможно сразу научиться писать идеально.
И я не понимаю, почему ты думаешь, что я что-то на что-то натягиваю. Я написал, что вторая сортировка родилась не потому, что код неправильно работал, а потому что в проверке были требования к входным данным, которые не описаны в условии. Там нет ни слова про выводить студентов в порядке возрастания id при равенстве сумм баллов.
Буду признателен, если объяснишь, как залезть в работу sorted. То, что код написан по твоему мнению отвратительно, я уже понял, это можно не повторять.

Офлайн

#6 Июнь 22, 2022 21:43:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9731
Репутация: +  843  -
Профиль   Отправить e-mail  

Решение задачи по массивам (МФТИ)

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



Отредактировано py.user.next (Июнь 22, 2022 21:57:06)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version