Как указано nazdrovje (см. здесь ) Упорядочивание @ Упорядочивание
может использоваться для получения ранга каждого элемента в списке. Даже когда список содержит повторяющиеся элементы, результатом является 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