5
$\begingroup$

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?

$\endgroup$
4
$\begingroup$

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}
$\endgroup$
  • $\begingroup$ 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? $\endgroup$ – Sungjin Lee Oct 30 '12 at 11:02
  • $\begingroup$ Sometimes, I wish they'd added an OrderingBy[] in complete analogy to SortBy[]... $\endgroup$ – J. M. will be back soon Oct 30 '12 at 11:07
  • $\begingroup$ @Sungjin, Ordering[{{1, 5}, {2, 8}, {3, 9}, {4, 2}, {5, 9}, {6, 7}, {7, 9}, {8, 10}, {9, 5}, {10, 2}}, All, If[Last[#1] != Last[#2], Last[#1] > Last[#2], First[#1] <= First[#2]] &] $\endgroup$ – J. M. will be back soon Oct 30 '12 at 11:14
  • 3
    $\begingroup$ @J.M. orderingBy[list_, f_] := Ordering[{f@#, #} & /@ list] $\endgroup$ – Dr. belisarius Oct 30 '12 at 12:37
  • 1
    $\begingroup$ Two or more, use a... Nest? Dijkstra would be proud! :) $\endgroup$ – Oleksandr R. Oct 30 '12 at 14:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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