Re: newbie list question

• To: mathgroup at smc.vnet.net
• Subject: [mg114990] Re: newbie list question
• Date: Tue, 28 Dec 2010 06:46:42 -0500 (EST)
• References: <if70bt\$330\$1@smc.vnet.net>

```On 12/26/2010 4:02 AM, Gareth Edwards wrote:
> Hi,
>
> Liking Mathematica a lot, but struggling with the early part of the learning curve, i.e. don't know what I don't know...
>
> What would be the neatest syntax for finding the first location of elements from one list in another? For example:
>
> listA = { 4,5,8,2,6,4 }
> listB = { 8,4,2 }
>
>
> I would like a function to return {3,1,4} in this case (the first location in A of each element in B)
>
> Many thanks!
>

The basic idea is to use Position to find the position of one element at
a time, then Map it across listB.

listA = {4, 5, 8, 2, 6, 4};
listB = {8, 4, 2};

See what this does:

Position[listA, 4]

You want only the first occurrence, so look at the Documentation for
Position, where you will find what you need here:

Position[expr,pattern,levelspec,n]
gives the positions of the first n objects found.

We want the first position, so n=1. We need a level specification (how
deep in a nested list), which is 1 since you have no nesting. So this:

Position[listA, 4, 1, 1]

Now, we want to apply this to each element of listB, instead the single
element 4 used in the example above. One way to do this is to write an
auxiliary function that does the operation you want on a single element,
call it x. Then Map this function across listB.

f[x_] := Position[listA, x, 1, 1];

Map[f, listB]

Finally, use Flatten to remove the extra braces:

Flatten[Map[f, listB]]

Once you get how that all works, try using a pure function to do it in
one fell swoop:

Flatten[Map[Position[listA, #, 1, 1] &, listB]]

--