Re: Extracting some elements, members of another list
- To: mathgroup at smc.vnet.net
- Subject: [mg112429] Re: Extracting some elements, members of another list
- From: Peter Pein <petsie at dordos.net>
- Date: Wed, 15 Sep 2010 04:39:18 -0400 (EDT)
- References: <i6nedc$g8u$1@smc.vnet.net>
Am Tue, 14 Sep 2010 09:14:20 +0000 (UTC) schrieb Nacho <ncc1701zzz at gmail.com>: > 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! > Hi Nacho, you can convert list1 to a list of rules by phonedatarules = Dispatch[Rule @@@ list1]; this needs only to be done once and needs ~11 seconds with 10^6 entries in list1 on my laptop. Then use thewanteddata=Transpose[{list2,list2/.phonedatarules}]; (~8 seconds with a random list of 464696 entries) and you'll get sth. like Take[thewanteddata,5]//InputForm --> { {Subscript[phone, 764884], Subscript[data, 764884]}, {Subscript[phone, 127257], Subscript[data, 127257]}, {Subscript[phone, 113745], Subscript[data, 113745]}, {Subscript[phone, 279308], Subscript[data, 279308]}, {Subscript[phone, 478296], Subscript[data, 478296]} } Regards, Peter