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$
1
  • $\begingroup$ Please have a look at SortBy. $\endgroup$ Oct 30, 2012 at 10:36

1 Answer 1

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$
6
  • $\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$ Oct 30, 2012 at 11:02
  • $\begingroup$ Sometimes, I wish they'd added an OrderingBy[] in complete analogy to SortBy[]... $\endgroup$ Oct 30, 2012 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$ Oct 30, 2012 at 11:14
  • 3
    $\begingroup$ @J.M. orderingBy[list_, f_] := Ordering[{f@#, #} & /@ list] $\endgroup$ Oct 30, 2012 at 12:37
  • 1
    $\begingroup$ Two or more, use a... Nest? Dijkstra would be proud! :) $\endgroup$ Oct 30, 2012 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.