Prev: question about an exciting gotcha for unittests (and elsewhere)...
Next: shove does not store data as expected
From: Chris Rebert on 21 Apr 2010 04:56 On Wed, Apr 21, 2010 at 1:51 AM, Stef Mientki <stef.mientki(a)gmail.com> wrote: > With the following code, I would expect a result of 5 !! > >>>> a= 'word1 word2 word3' >>>> a.rfind(' ',7) > 11 > > Is this a bug ? No. Don't you think someone would have found such an obvious bug by now? You want regular str.find(), which searches from left-to-right: >>>> a= 'word1 word2 word3' >>> a.find(' ') 5 str.rfind() is a variant of str.find() that searches from right-to-left. The "r" is for "right". Cheers, Chris -- http://blog.rebertia.com
From: James Mills on 21 Apr 2010 05:06 On Wed, Apr 21, 2010 at 6:51 PM, Stef Mientki <stef.mientki(a)gmail.com> wrote: > > With the following code, I would expect a result of 5 !! > >>>> a= 'word1 word2 word3' >>>> a.rfind(' ',7) > 11 > > Is this a bug ? Python's documentation states: | rfind(...) | S.rfind(sub [,start [,end]]) -> int | | Return the highest index in S where substring sub is found, | such that sub is contained within s[start:end]. Optional | arguments start and end are interpreted as in slice notation. | | Return -1 on failure. "Return the highest index in S" I haven't looked at python's source code for the str object, but perhaps this is exactly what it's algorithm does! cheers James
From: Peter Otten on 21 Apr 2010 05:15 Chris Rebert wrote: [didn't see the original message] > On Wed, Apr 21, 2010 at 1:51 AM, Stef Mientki <stef.mientki(a)gmail.com> > wrote: >> With the following code, I would expect a result of 5 !! >> >>>>> a= 'word1 word2 word3' >>>>> a.rfind(' ',7) >> 11 >> >> Is this a bug ? > > No. Don't you think someone would have found such an obvious bug by now? Indeed. OP: you may be looking for >>> a = "a bb ccc" >>> a[::-1].find(" ") 3 Peter
From: Paul Rudin on 21 Apr 2010 05:42 Peter Otten <__peter__(a)web.de> writes: > OP: you may be looking for > >>>> a = "a bb ccc" >>>> a[::-1].find(" ") > 3 But you should be aware of the effeciency implications of doing this. a[::-1] constructs a new list. It's probably faster to do e.g.: len(a) - a.rfind(..) - 1
From: Peter Otten on 21 Apr 2010 05:54 Paul Rudin wrote: > Peter Otten <__peter__(a)web.de> writes: > > >> OP: you may be looking for >> >>>>> a = "a bb ccc" >>>>> a[::-1].find(" ") >> 3 > > > But you should be aware of the effeciency implications of doing > this. a[::-1] constructs a new list. A new string, yes. > It's probably faster to do e.g.: > len(a) - a.rfind(..) - 1 Yes, especially if the string is "long": $ python -m timeit -s'a = "word1 word2 word3"' 'a[::-1].rfind(" ")' 1000000 loops, best of 3: 0.834 usec per loop $ python -m timeit -s'a = "word1 word2 word3"*100' 'a[::-1].rfind(" ")' 100000 loops, best of 3: 5.04 usec per loop $ python -m timeit -s'a = "word1 word2 word3"' 'len(a)-a.rfind(" ")-1' 1000000 loops, best of 3: 0.587 usec per loop $ python -m timeit -s'a = "word1 word2 word3"*100' 'len(a)-a.rfind(" ")-1' 1000000 loops, best of 3: 0.592 usec per loop But be aware of the following difference: >>> a[::-1].rfind("not there") -1 >>> len(a) - a.rfind("not there") -1 8 Peter
|
Next
|
Last
Pages: 1 2 3 Prev: question about an exciting gotcha for unittests (and elsewhere)... Next: shove does not store data as expected |