Как указано nazdrovje (см. здесь ) Ordering@Ordering
может использоваться для получения ранга каждого элемента в списке. Даже если список содержит повторяющиеся элементы, результатом является перестановка n (взятая в виде упорядоченного списка целых чисел от 1 до n без повторений), где элементу с наименьшим рейтингом присваивается 1, второму наименьшему 2 и т. Д. Как указывает Анджей Козловский , имеет место следующее (см. Также здесь ):
(Sort@mylist)[[Ordering@Ordering@mylist]]==mylist
Я хотел бы получить перестановочную ранжировку, в которой элементу с наивысшим рейтингом присваивается 1, второму наибольший 2 и т. Д., Так что выполняется следующее:
(Reverse@Sort@mylist)[[newPermutation]]==mylist
Это кажется простым, но мне удалось найти довольно неловкое решение. На данный момент я делаю следующее:
newPermutation= Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]
Есть ли более элегантный или более интуитивный способ? Там наверняка должно быть?
Пример:
mylist= {\[Pi],"abc",40,1, 300, 3.2,1};
Ordering@Ordering@mylist
Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]
Вывод (обратите внимание на взаимную связь между перестановками)
{7,6,4,1,5,3,2}
{1,2,4,7,3,5,6}
(оба следующие значения имеют значение True)
Sort@mylist)[[Ordering@Ordering@mylist]]== mylist
Reverse@Sort@mylist)[[ Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]]]== mylist