Re: Re: Finding the Position of Elements in a
- To: mathgroup at smc.vnet.net
- Subject: [mg102345] Re: [mg102195] Re: [mg102157] Finding the Position of Elements in a
- From: Gregory Lypny <gregory.lypny at videotron.ca>
- Date: Thu, 6 Aug 2009 06:31:08 -0400 (EDT)
- References: <200907310953.FAA19267@smc.vnet.net>
Yes, I think it will! Thank you. I'm going to subject it to some weird cases and maybe tweak a little. I'll repost with any changes I think might be interesting to the group. Regards. Gregory On Tue, Aug 4, 2009, at 5:42 AM, Leonid Shifrin wrote: > Hi Gregory, > > taking the (perhaps overly conservative) definition of a word as a > string matching the > pattern (LetterCharacter ..), the function below will hopefully do > what you need > > wordMatchPositions[listOfStrings : {__String}, searchWord_String] := > Position[ > StringCases[listOfStrings, LetterCharacter ..], > _?(MemberQ[#, searchWord] &)]; > > > Regards, > Leonid > > On Sat, Aug 1, 2009 at 11:58 AM, Gregory Lypny <gregory.lypny at videotron.ca > > wrote: > > Thanks again Leonid, > > I'll give this one a whirl. > > Gregory > > > On 31-Jul-09, at 10:16 AM, Leonid Shifrin wrote: > > > Hi Gregory, > > > > just an amendment to my previous post: > > > > memberPositions[listOfStrings, > > Flatten@StringCases[listOfStrings, __ ~~ searchString ~~ ___]] > > > > (I was missing Flatten). > > > > Also, I have realized that there are easier ways, like this, for > > example: > > > > Select[Transpose[{Range[Length[listOfStrings]], > > StringCases[ > > listOfStrings, __ ~~ > > searchString ~~ ___]}], #[[2]] =!= {} &][[All, 1]] > > > > > > Regarding your request to test for individual words - quite doable, > > I just happen > > to have zero time at the moment, to do it carefully. In case if no > > other solution is suggested,I will post one on Monday. > > > > Regards, > > Leonid > > > > > > > > On Fri, Jul 31, 2009 at 4:13 PM, Gregory Lypny <gregory.lypny at videotron.ca > > > wrote: > > Just what I needed. Thank you, Leonid, and I will thumb > through > > your book. One of the things I want to work on is a function that > > finds a word (string that is space delimited on both sides or one > > side if occurring at the beginning or end of a string). It would > > work something like > > > > If theSearchString is among the words of theTargetString then > > return True > > > > This is a function that Runtime Revolution (a.k.a MetaCard and > > originally HyperCard) has, and it is indispensible. > > > > Regards, > > > > Gregory > > > > > > > > On Fri, Jul 31, 2009, at 7:12 AM, Leonid Shifrin wrote: > > > >> Hi Gregory. > >> > >> Position[listOfStrings,x_/;StringMatchQ[x, __ ~~ searchString ~~ > >> ___]], > >> > >> if your list is not too large. If it is, and you want to speed it > >> up, one quick > >> solution is to use StringCases (as you did) to produce the list of > >> matches, > >> and then the <memberPositions> function that I developed in my > book: > >> > >> http://www.mathprogramming-intro.org/book/node596.html > >> > >> ,see at the bottom of the page - you feed both the original list > >> and the list of results to it, like this: > >> > >> memberPositions[listOfStrings, > >> StringCases[listOfStrings, __ ~~ searchString ~~ ___]] > >> > >> I expect this to be fast even for large lists of strings: > >> StringCases is much faster when used on a whole list of strings > >> rather than used separately on each string, and my function is also > >> rather fast. I did not benchmark you problem though, so it is just > >> my guess that this way will be faster than the first one above. > >> > >> > >> Hope this helps. > >> > >> Regards, > >> Leonid > >> > >> > >> > >> > >> On Fri, Jul 31, 2009 at 1:53 PM, Gregory Lypny <gregory.lypny at videotron.ca > >> > wrote: > >> Hello everyone, > >> > >> Suppose I have a list of strings, say, sentences such as > >> > >> listOfStrings = {"The cat is here.", "It's not here.", "Not > >> in the > >> catalogue,", "Where is the cat?"} > >> > >> and a string I want to search for > >> > >> searchString = "cat" > >> > >> I can use StringCases to pick off the elements that contain the > >> search > >> string > >> > >> StringCases[listOfStrings, __ ~~ searchString ~~ ___] > >> > >> {{"The cat is here."}, {}, {"Not in the catalogue,"}, > >> {"Where is the > >> cat?"}} > >> > >> But what if I just want to know the positions of the elements that > >> are > >> hits? In this case, it's > >> > >> {1, 3, 4} > >> > >> If I use > >> > >> Position[listOfStrings, ___ ~~ theString ~~ ___] > >> > >> I get > >> > >> {} > >> > >> which is not what I expect. Also how can I have my searchString > >> treated like it is a word so that 3 is not one of the hits? > >> > >> Any hints would be much appreciated. > >> > >> Gregory > >> > >> > > > > >