KEKIs
Сортировка инплейс осуществлялась не корректно, видимо потому, что в какой-то момент сортировка идет по частично отсортированному массиву
KEKIs
Ну в целом вот тут появляется разница:
...
results.sort(key=lambda x: sum([k[1] for k in results if k[0] == x[0]]), reverse=True)
...
В этой строке идёт два одновременных обращения к списку results. Так как метод list.sort() проводит сортировку в самом массиве, переставляя в нём элементы местами для временного хранения элементов, то при обращении к этому же массиву параллельно может происходить повторное обращение к одному и тому же элементу несколько раз. Так что код неправильный в любом случае.
Если же ты заменяешь list.sort() на sorted(), то сначала в sorted() создаётся новый список и элементы из первоначального списка попадают туда на свои места, а параллельный код обращается к неизменному первоначальному списку.
На практике оно так, конечно, не работает
>>> lst = [3, 2, 1]
>>> tmp = []
>>>
>>> lst.sort(key=lambda i: (i, tmp.append([j for j in lst])))
>>> lst
[1, 2, 3]
>>> tmp
[[], [], []]
>>>
>>> lst = [3, 2, 1]
>>> tmp = []
>>>
>>> lst.sort(key=lambda i: (i, tmp.append(str(lst))))
>>> lst
[1, 2, 3]
>>> tmp
['[]', '[]', '[]']
>>>
потому что там что-то происходит секретное.
Здесь видно, что lst вообще не имеет элементов, хотя имена эти видны внутри функции lambda и lambda не говорит, что не знает такого имени lst.
Так что я заменил в твоём нерабочем коде results на пустой список
>>> results = [(0, 3), (0, 10), (2, 3), (2, 2), (2, 4)]
>>> results.sort(key=lambda x: x[1], reverse=True)
>>> results.sort(key=lambda x: sum([k[1] for k in [] if k[0] == x[0]]), reverse=True)
>>> results
[(0, 10), (2, 4), (0, 3), (2, 3), (2, 2)]
>>>
получилось то же самое, что и у тебя.