正如nazdrovje所指出的那样(见here)Ordering@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
答案 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