Re: Extracting some elements, members of another list
- To: mathgroup at smc.vnet.net
- Subject: [mg112413] Re: Extracting some elements, members of another list
- From: Ray Koopman <koopman at sfu.ca>
- Date: Wed, 15 Sep 2010 04:36:08 -0400 (EDT)
- References: <i6nedc$g8u$1@smc.vnet.net>
On Sep 14, 2:14 am, Nacho <ncc1701... at gmail.com> wrote:
> Hi!
>
> I would like your advice about this problem:
>
> I have a list of elements, consisting in phone numbers with some data:
>
> list1= { { phone1, data1}, {phone2, data2}, {phone3, data3} .... }
>
> And a list of phones, a subset of the phone numbers in list1
>
> list2= {phone2, phone3, phone7... }
>
> I'd like to extract the elements from list1 whose phone numbers are
> present in list 2, that is:
>
> result= { { phone2, data2}, {phone3, data3, {phone7, data7} .... }
>
> I've used this with small lists and it works fine:
>
> result = Select[list1, MemberQ[list2, #[[1]]] &];
>
> The problem is that now I would like to use it with big lists. list1
> is over 1.000.000 elements long and list2 is about 500.000 elements
> long. Ordering is not a problem, I could resort the lists.
>
> Any hint to extract this list faster? It seems to take a lot of time
> (estimation is about 5 hours and I have to do it repeatedly)
>
> Thanks!
Block[{a = Sort@list1, b = Sort@list2, i = 1, j = 1},
Reap[While[i <= Length@a && j <= Length@b,
Which[a[[i,1]] < b[[j]], i++,
a[[i,1]] > b[[j]], j++,
True, Sow@a[[i]]; i++; j++]]][[2,1]]]