2011-01-20 56 views
6

正如nazdrovje(見here)所指出的,[email protected]可用於獲得列表中每個元素的排名。即使當列表包含重複元素時,結果也是 - 精確性(作爲無重複的整數1到n的有序列表),其中最低排列的元素被指定爲1,第二低的元素等被指出通過Andrzej Kozlowski,下式成立(也參見here):Ordering @ Ordering and Ranking排列

([email protected])[[[email protected]@mylist]]==mylist 

我想以產生排名置換其中最高排名元素被分配1,第二最高 2等,使得以下成立:

([email protected]@mylist)[[newPermutation]]==mylist 

這似乎很簡單,但我只能想出一個相當尷尬的解決方案。目前我執行以下操作:

newPermutation= [email protected][[email protected]@mylist,All,Greater] 

有沒有更優雅或更直觀的方法?肯定有?

一個例子:

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

[email protected]@mylist 

[email protected][[email protected]@mylist,All,Greater] 

輸出(注排列之間的相互關係)

{7,6,4,1,5,3,2} 
{1,2,4,7,3,5,6} 

(以下兩項評估爲True)

[email protected])[[[email protected]@mylist]]== mylist 
[email protected]@mylist)[[ [email protected][[email protected]@mylist,All,Greater]]]== mylist 

回答

4

如果設置

oldPerm = [email protected]@mylist 

然後

newPerm = - oldPerm + [email protected] + 1 

([email protected]@mylist)[[newPerm]]==mylist 

True


所以,你可以定義

newPerm[x_] := 1 + [email protected] - [email protected]@x 

([email protected]@mylist)[[newPerm[mylist]]] == mylist 

True

+0

這是非常好的!謝謝。我在辯論是否發佈這個問題,因爲我確實有過各種解決方案。我很高興現在我做了。 – tomd 2011-01-20 11:05:01