Re: Fast way to select those elements from a list that are in another

*To*: mathgroup at smc.vnet.net*Subject*: [mg86806] Re: Fast way to select those elements from a list that are in another*From*: "Andrew Moylan" <andrew.j.moylan at gmail.com>*Date*: Fri, 21 Mar 2008 01:55:52 -0500 (EST)*References*: <frt574$sj8$1@smc.vnet.net> <47E23A75.7030909@gmail.com>

To clarify: the list I want to construct is those elements from a that are members of b: Select[a, MemberQ[b, #] &] This is (I think!) the same as With[ {c = Intersection[a, b]}, Select[a, MemberQ[c, #] &] ] but the latter is faster. On 20/03/2008, Szabolcs Horv=E1t <szhorvat at gmail.com> wrote: > > Andrew Moylan wrote: > > Two lists of integers: > > > > {a, b} = Table[RandomInteger[10000, 1000], {2}]; > > > > Which elements from a are in b? > > > > Select[a, MemberQ[b, #] &]; // Timing > >>> {0.351, Null} > > > > It takes about 0.351 seconds (on my slow laptop). Specialised > > functions for related tasks, such as Intersection[a, b], are much > > faster: > > > > Intersection[a, b]; // Timing > >>> {0., Null} > > > > Using Intersection, here's a somewhat faster way to select those > > elements from a that are in b: > > > > With[ > > {c = Intersection[a, b]}, > > Select[a, MemberQ[c, #] &] > > ]; // Timing > >>> {0.09, Null} > > > > Is there a better, faster way to do this? > > > > Hi Andrew, > > You did not formulate the problem precisely. There are two differences > between c and d = Select[a, MemberQ[c, #] &. One is that c is sorted, > while d is not, and the other is that duplicates are removed from c. > Which of these two are important? > > If only one of the two is important then I can come up with much faster > solutions, but if *both* are important then the problem becomes more > difficult. >