Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top


M = {{"Utah", 2}, {"Iowa", 1}, {"Maine", 3}, {"Total", 6}}

I want to obtain the reverse-sorted result like this:

Reverse@SortBy[Most@M, Last]~Join~{Last@M}


{{"Maine", 3}, {"Utah", 2}, {"Iowa", 1}, {"Total", 6}}

Still learning the languange, I kindly ask you to propose a shorter and - probably faster -solution for a country with 10^6 federal states.

share|improve this question
Your code runs in my machine well under 1 sec for 10^6 elements- What is your expectation? – Dr. belisarius May 21 '14 at 0:11
M[[Ordering[M[[;; -2, 2]], All, Greater]]]~Join~(Last@M) should be faster. see Ordering – kglr May 21 '14 at 0:14
You can use RotateLeft instead of Most and Join but it's not affecting speed. RotateLeft@Reverse@SortBy[M, Last] & – Öskå May 21 '14 at 0:14
@kguler It's 6 times slower here – Dr. belisarius May 21 '14 at 0:17
@belisarius - as a novice I just wanted to know, if "I did the right way" - thanks for your quick reply. – eldo May 21 '14 at 0:17
up vote 3 down vote accepted

Using belisarius's test setup and a modification of the Ordering-based method:

c = Transpose[{StringJoin /@ Permutations@Characters["123456789"], Range[9!]}];
M = Join[c, c, c]; 
Print@Timing[l1=Reverse@SortBy[Most@M, Last]~Join~{Last@M};];
Print@Timing[l2= M[[Ordering[M[[;; -2, 2]], All, Greater]]]~Join~{Last@M};];
Print@Timing[l3=Reverse@M[[Ordering[Most[M[[All, 2]]]]]]~Join~{Last@M};];
Print@Timing[l4 = Reverse@M[[Ordering[M[[;; -2, 2]]]]]~Join~{Last@M};]
Print@ Timing[l5 = RotateLeft@Reverse@M[[Ordering[M[[All, 2]]]]];]
l1 == l2 == l3 == l4 == l5

(* {0.406250,Null}
   True *)
share|improve this answer
Much faster (and correct result) now – Dr. belisarius May 21 '14 at 0:40

Your Answer


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.