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"};
>
>
>
> 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
>