订购@订购和排名排列

tom*_*omd 6 wolfram-mathematica

正如nazdrovje(参见此处)所指出的,Ordering@Ordering可用于获得列表中每个元素的等级.即使列表包含重复的元素,结果也是一个n -permutation(作为整数1到n的有序列表而没有重复),其中排名最低的元素被赋值为1,第二个最低的元素为2,等等.正如Andrzej所指出的那样.Kozlowski,以下成立(另见此处):

(Sort@mylist)[[Ordering@Ordering@mylist]]==mylist
Run Code Online (Sandbox Code Playgroud)

我想产生一个排名排列,其中排名最高的元素被分配1,第二个最高的 2等,以便以下成立:

(Reverse@Sort@mylist)[[newPermutation]]==mylist
Run Code Online (Sandbox Code Playgroud)

这看起来很简单,但我只能提出一个非常尴尬的解决方案.目前我做了以下事情:

newPermutation= Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]
Run Code Online (Sandbox Code Playgroud)

有更优雅,更直观的方式吗?肯定一定有吗?

一个例子:

mylist= {\[Pi],"abc",40,1, 300, 3.2,1};

Ordering@Ordering@mylist

Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]
Run Code Online (Sandbox Code Playgroud)

输出(注意排列之间的相互关系)

{7,6,4,1,5,3,2}
{1,2,4,7,3,5,6}
Run Code Online (Sandbox Code Playgroud)

(以下两个评估为True)

Sort@mylist)[[Ordering@Ordering@mylist]]== mylist
Reverse@Sort@mylist)[[ Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]]]== mylist
Run Code Online (Sandbox Code Playgroud)

Dr.*_*ius 4

如果你设置

 oldPerm = Ordering@Ordering@mylist
Run Code Online (Sandbox Code Playgroud)

然后

 newPerm = - oldPerm + Length@mylist + 1
Run Code Online (Sandbox Code Playgroud)

(Reverse@Sort@mylist)[[newPerm]]==mylist
Run Code Online (Sandbox Code Playgroud)

True


所以,你可以定义

newPerm[x_] := 1 + Length@x - Ordering@Ordering@x
Run Code Online (Sandbox Code Playgroud)

例如

(Reverse@Sort@mylist)[[newPerm[mylist]]] == mylist  
Run Code Online (Sandbox Code Playgroud)

True