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)
如果你设置
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