MathGroup Archive 2009

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Finding the Position of Elements in a List that

  • To: mathgroup at smc.vnet.net
  • Subject: [mg102190] Re: [mg102157] Finding the Position of Elements in a List that
  • From: Leonid Shifrin <lshifr at gmail.com>
  • Date: Sat, 1 Aug 2009 03:57:31 -0400 (EDT)
  • References: <200907310953.FAA19267@smc.vnet.net>

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
>>
>>
>


  • Prev by Date: Re: Finding the Position of Elements in a List that Contain
  • Next by Date: Re: Skellam distribution
  • Previous by thread: Re: Finding the Position of Elements in a List that
  • Next by thread: Re: Finding the Position of Elements in a List that