MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Sorting strings

  • To: mathgroup at smc.vnet.net
  • Subject: [mg123144] Re: Sorting strings
  • From: Leonid Shifrin <lshifr at gmail.com>
  • Date: Thu, 24 Nov 2011 06:58:44 -0500 (EST)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <201111231207.HAA14969@smc.vnet.net>

Yes this is possible, although I don't see a very straightforward way of
doing that efficiently.
This function will be reasonably fast:

sortStringVars[vars : {__String}] :=
 With[{split =
    Flatten[StringCases[vars,
      ShortestMatch[x__] ~~ y : (DigitCharacter ..) :> {x, ToExpression@y}],
1]},
  MapThread[StringJoin, {#[[All, 1]], ToString /@ #[[All, 2]]}] &@
   SortBy[split, {First, Last}]]

For example,

In[104]:= sortStringVars[{"a1", "a2", "a20", "a12"}]

Out[104]= {"a1", "a2", "a12", "a20"}

Here is a benchmark on larger sample of randomly generated variables:

testStrings =
  Flatten@Outer[StringJoin, CharacterRange["a", "z"],
    ToString /@ RandomInteger[10000, 5000]];

In[108]:= Length[testStrings]

Out[108]= 130000

In[109]:= sortStringVars[testStrings]//Short//Timing

Out[109]=
{1.17,{a1,a6,a6,a7,a7,a8,<<129989>>,z9997,z9998,z9999,z10000,z10000}}

I am not claiming this is the fastest implementation possible in
Mathematica, just reasonably fast
to not be a major bottleneck.

Regards,
Leonid


On Wed, Nov 23, 2011 at 3:07 PM, Themis Matsoukas <tmatsoukas at me.com> wrote:

> Sorting this list of strings
>
> {"a1", "a2", "a20", "a12"} // Sort
>
> I get
>
> {"a1", "a12", "a2", "a20"}
>
> but I would like the numerals to be sorted as numbers, i.e., as
>
> {"a1", "a2", "a12",  "a20"}
>
> Is this possible or do I have to rename "a1" into "a01" etc?
>
> Thanks
>
> Themis
>
>


  • Prev by Date: Color discontinuity with ColorFunction in ContourPlot
  • Next by Date: Non trivial substitution in a very long output
  • Previous by thread: Re: Sorting strings
  • Next by thread: Re: Sorting strings