Re: finding positions of elements in a list
- To: mathgroup at smc.vnet.net
- Subject: [mg87074] Re: finding positions of elements in a list
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Mon, 31 Mar 2008 02:03:19 -0500 (EST)
- Organization: The Open University, Milton Keynes, UK
- References: <frt5e9$srg$1@smc.vnet.net>
PeterM wrote: > Having a few problems here with what I think should be a simple operation. I have a list as shown: > > mylist={{20, 109}, {20, 110}, {20, 111}, {21, 105}, {21, 106}, {21, 107},...} > > It's a list of {x,y} co-ordinates of some data points I'm analysing. > > I want to create a new list which contains only those data points whose y co-ordinate is greater than 80 ie. mylist[[n,2]]>80. > > Problem is, I can't work out how to use Select to do this when each element in the list has an x and a y co-ordinate. If I split the list into x and y co-ordinates and searched for those y values greater than 80, I would have a list of those y-values but would not know the corresponding x-values. > > I also tried Position but it wasn't clear to me if a pattern can be used for this. FWIW, Here is a summary of most of the post with some new solutions and some benchmarking to get you inspired by the versatility of Mathematica programming language. In[1]:= myList = {{20, 109}, {20, 110}, {20, 111}, {21, 105}, {21, 106}, {21, 107}} myList /. {x_, y_ /; y <= 107} -> Sequence[] Cases[myList, {x_, y_ /; y > 107}] DeleteCases[myList, {x_, y_ /; y <= 107}] Select[myList, Last@# > 107 &] Pick[myList, Thread[myList[[All, 2]] > 107]] myList[[Flatten@Position[myList, {_, y_ /; y > 107}]]] Table[If[myList[[j]][[2]] > 107, myList[[j]]], {j, Length[myList]}] /. Null -> Sequence[] If[#[[2]] > 107, #] & /@ myList /. Null -> Sequence[] Out[1]= {{20, 109}, {20, 110}, {20, 111}, {21, 105}, {21, 106}, {21, 107}} Out[2]= {{20, 109}, {20, 110}, {20, 111}} Out[3]= {{20, 109}, {20, 110}, {20, 111}} Out[4]= {{20, 109}, {20, 110}, {20, 111}} Out[5]= {{20, 109}, {20, 110}, {20, 111}} Out[6]= {{20, 109}, {20, 110}, {20, 111}} Out[7]= {{20, 109}, {20, 110}, {20, 111}} Out[8]= {{20, 109}, {20, 110}, {20, 111}} Out[9]= {{20, 109}, {20, 110}, {20, 111}} In[10]:= myList = Table[Sequence @@ myList, {20000}]; myList /. {x_, y_ /; y <= 107} -> Sequence[] // Timing // First Cases[myList, {x_, y_ /; y > 107}] // Timing // First DeleteCases[myList, {x_, y_ /; y <= 107}] // Timing // First Select[myList, Last@# > 107 &] // Timing // First Pick[myList, Thread[myList[[All, 2]] > 107]] // Timing // First myList[[Flatten@Position[myList, {_, y_ /; y > 107}]]] // Timing // First Table[If[myList[[j]][[2]] > 107, myList[[j]]], {j, Length[myList]}] /. Null -> Sequence[] // Timing // First If[#[[2]] > 107, #] & /@ myList /. Null -> Sequence[] // Timing // First Out[11]= 0.147246 Out[12]= 0.098208 Out[13]= 0.113085 Out[14]= 0.15736 Out[15]= 0.084279 Out[16]= 0.230995 Out[17]= 0.342529 Out[18]= 0.295696 In[19]:= $Version Out[19]= "6.0 for Mac OS X x86 (64-bit) (February 7, 2008)" Regards, -- Jean-Marc