Re: Finding shared element in two lists
- To: mathgroup at smc.vnet.net
- Subject: [mg114120] Re: Finding shared element in two lists
- From: "Ingolf Dahl" <ingolf.dahl at telia.com>
- Date: Wed, 24 Nov 2010 06:59:11 -0500 (EST)
To Jason,
(the question and my answer has also appeared in another forum)
The function
lastcommon[a_List, b_List] /; (a[[1]] == b[[1]]) :=
a[[NestWhile[(# + 1) &,
1, (And[Length[a] > #, Length[b] > #,
a[[# + 1]] == b[[# + 1]]]) &]]]
LongestCommonSequence[] does something else:
In[40]:= LongestCommonSequence[{1, 2, 3, 4, 5}, {1, 3, 4, 5, 6, 7}]
Out[41]= {3, 4, 5}
In[41]:= LongestCommonSubsequence[{1, 2, 3, 4, 5}, {1, 3, 4, 5, 6, 7}]
Out[41]= {3, 4, 5}
In[42]:= lastcommon[{1, 2, 3, 4, 5}, {1, 3, 4, 5, 6, 7}]
Out[42]= 1
I suggest another command, which does not require the first elements to be
equal. It returns all the common start elements as a list:
commonstart[a_List, b_List] :=
Take[a, NestWhile[(# + 1) &,
0, (And[Length[a] > #, Length[b] > #,
a[[# + 1]] == b[[# + 1]]]) &]]
In[47]:= commonstart[{1, 2, 3, 4, 5}, {1, 3, 4, 5, 6, 7}]
Out[47]= {1}
In[48]:= commonstart[aphid, friendshouse]
Out[48]= {}
In[49]:= commonstart[aphid, mosquito]
Out[49]= {"Insecta", "Dicondylia", "Pterygota", "Neoptera"}
With the additional definitions below, commonstart may take any number of
arguments:
commonstart[] := {}
commonstart[a_List] := a;
commonstart[a_List, b_List, c__List] :=
commonstart[commonstart[a, b], c];
Best regards
Ingolf Dahl
> -----Original Message-----
> From: Jason Ebaugh [mailto:ebaughjason at gmail.com]
> Sent: den 22 november 2010 13:41
> To: mathgroup at smc.vnet.net
> Subject: [mg114072] Finding shared element in two lists
>
> I am trying to write a function that would take two lists of increasing
more
> precise location, and return the most specific level of geography that
they
> share.
>
> myhouse={"Earth", "North America", "USA", "Illinois", "Champaign County",
> "Urbana"};
> friendshouse={"Earth", "North America", "USA", "Minnesota", "Ramsey
County",
> "St. Paul"};
>
> In this case, the function should output USA.
>
> I could do this procedurally well enough. But I am really trying to get
> comfortable with functional programming.
>
>
>
> The above is just a more digestible version of what I am really trying to
> do. I want to find the lowest level of taxonomy that two species share.
>
> Ex:
> aphid={"Insecta", "Dicondylia", "Pterygota", "Neoptera", "Paraneoptera",
> "Hemiptera", "Sternorrhyncha", "Aphidiformes", "Aphidomorpha",
"Aphidoidea",
> "Aphididae", "Aphidinae", "Macrosiphini", "Acyrthosiphon"};
> mosquito={"Insecta", "Dicondylia", "Pterygota", "Neoptera",
"Endopterygota",
> "Diptera", "Nematocera", "Culicimorpha", "Culicoidea"};
>
> answer = Neoptera
>
>
> Thank a 10^6,
> Jason
>
>
> --
> Jason Ebaugh, PhD.
>
> Personal communications: ebaughjason at gmail.com
> Business communications: jason.ebaugh at apisscientific.com
> Dissertation: http://hdl.handle.net/2142/13005
> Linkedin:
>
http://www.linkedin.com/profile?viewProfile=&key=22842228&locale=en_US&trk=t
ab_pr
> o
> Need bioinformatics help? www.apisscientific.com