Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

How can I numbering the elements in descending order of second elements of sublists? For example, if I have the list which is

m={{1, 5}, {2, 8}, {3, 9}, {4, 2}, {5, 9}, {6, 7}, {7, 9}, {8, 10}, {9, 5}, {10, 2}};

The smallest second element is 2 of {10,2} so its number is 1.
Second smallest second element is also 2 of {4,2} so its number will be 2.
The output that I want is then: {4, 6, 9, 2, 8, 5, 7, 10, 3, 1}.
How can I do this?

share|improve this question
    
Please have a look at SortBy. –  b.gatessucks Oct 30 '12 at 10:36

1 Answer 1

Why you rank {10, 2} before {4, 2} escapes me. Ignoring that:

m = {{1, 5}, {2, 8}, {3, 9}, {4, 2}, {5, 9}, {6, 7},
     {7, 9}, {8, 10}, {9, 5}, {10, 2}};

m[[All, 2]] // Ordering // Ordering
{3, 6, 7, 1, 8, 5, 9, 10, 4, 2}

Equivalent: Nest[Ordering, m[[All, 2]], 2]

See Ordering.


If we reverse m before and after we get:

Nest[Ordering, Reverse[m][[All, 2]], 2] // Reverse
 {4, 6, 9, 2, 8, 5, 7, 10, 3, 1}
share|improve this answer
    
oh, I miss that part. If second element is same, I want to rank the sublists in ascending order of first element. Can you help me one more time please? –  Sungjin Lee Oct 30 '12 at 11:02
    
Sometimes, I wish they'd added an OrderingBy[] in complete analogy to SortBy[]... –  J. M. Oct 30 '12 at 11:07
    
Thank you very much!!! –  Sungjin Lee Oct 30 '12 at 11:11
3  
@J.M. orderingBy[list_, f_] := Ordering[{f@#, #} & /@ list] –  belisarius Oct 30 '12 at 12:37
1  
Two or more, use a... Nest? Dijkstra would be proud! :) –  Oleksandr R. Oct 30 '12 at 14:02

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.