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 > >
- References:
- Sorting strings
- From: Themis Matsoukas <tmatsoukas@me.com>
- Sorting strings