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 /@
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