Форум сайта python.su
py.user.next
Да, извиняюсь, ерунду написал) ближе к вечеру мозг уже не работает)
Дело было как раз в обратном. Сортировка инплейс осуществлялась не корректно, видимо потому, что в какой-то момент сортировка идет по частично отсортированному массиву Если мое предположение неверно, прошу поправить. Факт в том, что при замене sort на sorted код работает правильно.
Офлайн
KEKIsЗвучит бредово.
Сортировка инплейс осуществлялась не корректно, видимо потому, что в какой-то момент сортировка идет по частично отсортированному массиву
Офлайн
py.user.next
Ну в целом вот тут появляется разница:
#Способ 1, нерабочий 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 results if k[0] == x[0]]), reverse=True) print(results) #[(0, 10), (2, 4), (0, 3), (2, 3), (2, 2)] #Способ 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.sort(key=lambda x: sum([k[1] for k in results if k[0] == x[0]]), reverse=True)
results = [(0, 3), (0, 10), (2, 3), (2, 2), (2, 4)] d = {} for i in range(len(results)): k, n = results[i] if k not in d: d[k] = sum(p[1] for p in results if p[0] == k) results[i] = (d[k], k, n) results.sort(key=lambda i: i[0], reverse=True) results = [(i[1], i[2]) for i in results] print(results)
Отредактировано FishHook (Июнь 20, 2022 15:25:20)
Офлайн
FishHook
Согласен, до оптимальности тут далеко. Мне самому больно смотреть на код, который я запостил полторы недели назад)
Справедливости ради, мое решение прошло проверку, в т.ч. по времени выполнения, а само задание не предполагает использование словарей.
Офлайн
KEKIs
Справедливости ради, мое решение прошло проверку
Офлайн
хммм, я вот тут бороду почесал и кажется что питон кеширует ключ для каждого элемента
так что может это и не так сильно ускорит как хотелось бы, но все равно ускорит, потому что словарь сократит количество проходов по списку
Отредактировано FishHook (Июнь 20, 2022 16:37:38)
Офлайн
KEKIsтут скорее ошибка в том, что вы обращаетесь к списку во время его изменения
сортировка идет по частично отсортированному массиву
import random l =list(range(10)) random.shuffle(l) print(l) j = 0 def foo(i): global j, l j += 1 print(f"{j=}, {l=}") return i l.sort(key=foo) print(l)
Офлайн
KEKIs
Сортировка инплейс осуществлялась не корректно, видимо потому, что в какой-то момент сортировка идет по частично отсортированному массиву
KEKIsВ этой строке идёт два одновременных обращения к списку results. Так как метод list.sort() проводит сортировку в самом массиве, переставляя в нём элементы местами для временного хранения элементов, то при обращении к этому же массиву параллельно может происходить повторное обращение к одному и тому же элементу несколько раз. Так что код неправильный в любом случае.
Ну в целом вот тут появляется разница:... results.sort(key=lambda x: sum([k[1] for k in results if k[0] == x[0]]), reverse=True) ...
>>> 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 ['[]', '[]', '[]'] >>>
>>> 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)] >>>
Отредактировано py.user.next (Июнь 20, 2022 18:26:16)
Офлайн
KEKIsПочему не предполагает?
а само задание не предполагает использование словарей
Офлайн