#python #arrays #python-3.x #algorithm #sorting
#python #массивы #python-3.x #алгоритм #сортировка
Вопрос:
Я работаю над самой популярной задачей Quora для авторов на CodeSignal.
Учитывая 3 входных данных, нам нужно выполнить сортировку в зависимости от того, какой пользователь имеет наибольшее количество просмотров по ряду тем.
Вот мой алгоритм:
def mostViewedWriters(topicIds, answerIds, views):
finallist = []
for x in enumerate(sorted(list(set(i for j in topicIds for i in j)))):
returnlist = []
for x in [q for p, q in enumerate(views) if q[0] in sorted([item for sublist in [z for q, z in enumerate(answerIds) if q in [i for i , y in enumerate(topicIds) if x[1] in y]] for item in sublist])]:
sbl = [y for p, y in returnlist if p == x[1]]
if not sbl:
returnlist.append([x[1], x[2]])
else:
for idx, item in enumerate(returnlist):
if item[0] == x[1]:
added = item[1] x[2]
returnlist[idx] = [x[1], added]
res = sorted(returnlist, key=lambda x: x[1], reverse=True)
finallist.append(res)
return finallist
К сожалению, приведенный выше алгоритм не выполняется для одного условия, которое я нашел в тексте задачи:
Если у двух пользователей одинаковое количество просмотров, пользователь с меньшим идентификатором пользователя должен быть первым.
Так, например, один из моих 2D-списков, который я добавляю к объекту finallist, выглядит следующим образом:
[[3,3],[2,3],[1,1]]
Поскольку значение привязано к первым двум спискам, мне нужно поменять местами эти два списка. Если бы их было 3 как таковых:
[[3,3],[1,3],[2,3],[1,1]]
Их необходимо будет переупорядочить как таковые:
[[3,3],[2,3],[1,3],[1,1]]
Сначала сортируется значение x [1], но затем значение x [0] сортируется следующим образом В ОБРАТНОМ ПОРЯДКЕ, x[0] — сортировка по убыванию, а x[1] — сортировка по возрастанию.
Как я могу запускать подмассивную сортировку каждый раз, когда есть связь со значением x[1]? Есть ли способ обновить лямбда-выражение в моей отсортированной функции в конце моего алгоритма, который позволит достичь этого?
Спасибо.
Комментарии:
1. Это действительно плотный, сложный код. Вам будет трудно найти других, которые могут вам помочь, потому что это довольно сложно понять. Я бы порекомендовал вам потратить несколько минут на извлечение некоторых вспомогательных функций со значимыми именами, Улучшение имен переменных и т. Д. У вас есть 5 уровней вложенности (
if
внутри afor
внутриelse
внутри `for` внутри afor
), что довольно сложно понять2. Да, поскольку это codesignal, код сильно сокращен. Мне действительно просто нужен способ сортировки завершенного массива — другими словами, чтобы совпадающие значения сортировались в порядке, обратном порядку несовпадающих значений.
3. Я не знаю, что все это значит. Вы должны прислушаться к моему совету.
Ответ №1:
Это можно сделать двумя способами.
- Поскольку в вашем массиве нет отрицательных чисел, вы можете сохранить идентификатор пользователя как отрицательный, а затем выполнить сортировку по убыванию в списке. Он автоматически получит идентификатор пользователя в порядке возрастания.
- Используя
key
параметр, вы можете использовать простую лямбда-функцию, например
l = [[1,2],[2,3],[2,1]]
l.sort(key=lambda x: (x[1], -x[0]), reverse=True)
print(l) #[[2, 1], [2, 3], [1, 2]]
Комментарии:
1. Выглядит интересно! Я попробую и отчитаюсь. Большое спасибо!
2. @EricConklin если это решает вашу цель, подумайте о том, чтобы пометить его принятым ответом
Ответ №2:
Используя предложение Abhinav с ключевым параметром в отрицательном значении для значения x[0], я поиграл с этим и придумал следующее:
res = sorted(returnlist, key=lambda x: (x[1], -x[0]), reverse=True)
Это создает обратную сортировку как для значений x[0], так и для значений x[1], при этом сортировка x[1] является первичной, а значение -x[1] является вторичной или вспомогательной сортировкой из первого.
Код Abhinav был правильным, за исключением того, что в нем отсутствовал параметр reverse=True — необходимость в первую очередь выполнить обратную сортировку и обычную сортировку по возрастанию, поскольку целью была подмассив, и удаление обратного параметра привело к тому, что это больше не работало.
Комментарии:
1. Вы должны были добавить отсутствующее ключевое слово в качестве комментария, а не ответа. В любом случае, я добавил его к своему.
2. Извините, я изменил отсутствующее ключевое слово, а также использовал метод сортировки, а не метод сортировки, благодаря которому мой код работал так, как предполагалось изначально.
3. Речь идет не о предоставлении ответа «который идеально соответствует вашему коду». Это общий ответ, который демонстрирует, как использовать функции сортировки, а также тот, который поможет вам в решении вашей цели.