Re: newbie list question
- To: mathgroup at smc.vnet.net
- Subject: [mg114990] Re: newbie list question
- From: Helen Read <readhpr at gmail.com>
- 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]]
--
Helen Read
University of Vermont