Re: Position
- To: mathgroup at smc.vnet.net
- Subject: [mg131196] Re: Position
- From: "McHale, Paul" <Paul.McHale at excelitas.com>
- Date: Mon, 17 Jun 2013 06:24:51 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-outx@smc.vnet.net
- Delivered-to: mathgroup-newsendx@smc.vnet.net
This is something I run into a lot. I think there are many ways to solve it and many have been listed. To me, there are three approaches which will allow me to have found something in a list and preserved it's place in the list.
1. Using something that naturally operates on index. I.e. For[]
2. Adding index to list, then selecting base on value. I.e. Table[] or Range[]/Riffle[]
3. Getting list of positions within list and matching up to data. I.e. Position[]
Generate list "m"
m = RandomInteger[{1, 1000}, 1000];
I prefer Table[] as I am most comfortable with it. I add the index to every list member and then select the members that I want. Not memory efficient. I like it because people can see what the list elements will look like. [{index,m[[index]]}
mPos=Table[{index,m[[index]]},{index,1,Length[m]}];
m2=Select[mPos,#[[2]] > 500 &]
I think this is less obvious (for newbies), but works just as well
mPos = Partition[Riffle[Range[Length[m]], m], 2];
m3 = Select[mPos, #[[2]] > 500 &]
Probably the most memory efficient was mentioned by others. Find the position and retrieve only the needed values into new list.
mPos=Position[m,x_ /; x > 500] // Flatten;
m1=Map[{#,Take[m,{#}][[1]]}&,mPos]
> m1==m2==m3
True
( Not that his is conclusive, but even I would have a hard time screwing it up three different ways and having identical results. This is a serious benefit of Mathematica over other languages and is probably one of the greatest tools I have for minimizing defects. I see other people here doing it as well.)
I don't use the For[] loop because I think it does not fit well. It is clumsy for functional programming. It is also awkward for people who are used to traditional language for loops due to everything being a parameter to For[]. Just my opinion.
Paul McHale | Electrical Engineer, Energetic Systems | Excelitas Technologies Corp.
Office: +1 937.865.3004 | Fax: +1 937.865.5170
1100 Vanguard Boulevard, Miamisburg, OH 45342-0312
Paul.McHale at Excelitas.com
www.excelitas.com