MathGroup Archive 2006

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

Search the Archive

Re: position lists

  • To: mathgroup at smc.vnet.net
  • Subject: [mg68778] Re: position lists
  • From: Peter Pein <petsie at dordos.net>
  • Date: Fri, 18 Aug 2006 03:12:34 -0400 (EDT)
  • References: <ebujvu$6lu$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

rych schrieb:
> have
>   In: a = {1, 1, 2, 2, 1, 4}
> want
>   {{1, 2, 5}, {3, 4}, {0}, {6}};
> 
> more effectively than just
>   In: Position[a, #] & /@ Range[4]
>   Out: {{{1}, {2}, {5}}, {{3}, {4}}, {}, {{6}}}
> 
> Ideas? Known one-liners?
> Thanks
> Igor
> 


Hi Igor,

I compared some different approaches to this task.

the obvious one, which you do not like:
Pos[1][a_, n_] := Flatten /@ (Position[a, #1] & ) /@ Range[n] /. {} -> {0};

one with Case[]:
Pos[2][a_, n_] := Module[{ao = Ordering[a], as},
     as = a[[ao]]; (Cases[Transpose[{as, ao}], {#1, x_} :> x] & ) /@
        Range[n] /. {} -> {0}];

this one uses Pick[]
Pos[3][a_, n_] := Module[{ao = Ordering[a], as},
      as = a[[ao]]; (Pick[ao, as, #1] & ) /@ Range[n]] /. {} -> {0};

Sow/Reap:
Pos[4][a_, n_] := Flatten /@
    (Reap[(MapThread[Sow, {#1, a[[#1]]}] & )[Ordering[a]], 
Range[n]][[2]] /.
     {} -> {{0}})

and the Sow/Reap variant by "dkr":
Pos[5][a_, n_] := Flatten[Reap[MapIndexed[Sow[#2[[1]], #1] & , a], 
Range[n]][[
      2]] /. {} :> {{0}}, 1]

The winner is the fourth version.

See
http://people.freenet.de/Peter_Berlin/Mathe/Igor_Pos.nb

or if you're sitting in front of a box without Mathematica/MathReader:

http://people.freenet.de/Peter_Berlin/Mathe/Igor_Pos.pdf


Peter


  • Prev by Date: Re: Several functions in a single 2D-plot
  • Next by Date: Re: calculate Recurrence Equations
  • Previous by thread: Re: position lists
  • Next by thread: Re: position lists