#python #ranking
#питон #Рейтинг
Вопрос:
Я пытаюсь переставить набор чисел, однако я пытаюсь, чтобы наименьшее число имело наивысший ранг
Мой вклад-это список=[312198.0, 306400.0, 270345.0, 367979.0, 375502.0]
и мой желаемый результат-ранг=[3,4,5,2,1]
Мой код таков:
list=[312198.0, 306400.0, 270345.0, 367979.0, 375502.0] seq = sorted(x) index = [seq.index(v) for v in x] print(index)
Мой текущий выход составляет [2, 1, 0, 3, 4]
Комментарии:
1.
index = [seq.index(v) 1 for v in x]
?2.
[seq.index(v) 1 for v in x]
?
Ответ №1:
У вас просто есть это на самом деле,с плюсом, пока вы инициализируете index
массив.
def answer(): list = [312198.0, 306400.0, 270345.0, 367979.0, 375502.0] seq = sorted(list) index = [seq.index(v) 1 for v in list] print(index)
Комментарии:
1. и у вас есть ошибка компиляции в вашем коде при сортировке, я предполагаю, что вы сортируете исходный массив, а не неизвестную переменную, называемую
x
2. Действительно, я сортирую исходный массив, однако я понял, что задал вопрос наоборот. Мне нужно отсортировать его таким образом, чтобы самая высокая стоимость имела значение 1, а самая низкая-5.
3. Не используйте список в качестве имени переменной, это затеняет (и вызывает путаницу у читателя) встроенный список
Ответ №2:
Вы можете отсортировать индексы в порядке убывания значений и присвоить значение ранга в позиции отсортированного индекса:
L=[312198.0, 306400.0, 270345.0, 367979.0, 375502.0] ranks = list(range(len(L))) for r,i in enumerate(sorted(ranks,key=lambda i:L[i],reverse=True),1): ranks[i]=r print(ranks) [3, 4, 5, 2, 1]
Вы также могли бы сделать это более кратко (но менее эффективно), используя понимание списка, в котором вы подсчитываете количество элементов, превышающих каждое значение:
ranks = [1 sum(item gt; value for item in L) for value in L]
Первое решение-O(NlogN), а второе-O(N^2)
Также обратите внимание, что 1-е решение даст разные ранги равным значениям, но второе даст им одинаковый ранг