订购@订购和排名排列

时间:2011-01-20 01:55:50

标签: wolfram-mathematica

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

(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

1 个答案:

答案 0 :(得分:4)

如果您设置

 oldPerm = Ordering@Ordering@mylist

然后

 newPerm = - oldPerm + Length@mylist + 1

(Reverse@Sort@mylist)[[newPerm]]==mylist

是     True


因此,您可以定义

newPerm[x_] := 1 + Length@x - Ordering@Ordering@x

(Reverse@Sort@mylist)[[newPerm[mylist]]] == mylist  

True