Bug in string.find

Ron Adam rrr at ronadam.com
Fri Sep 2 22:29:06 EDT 2005


Terry Reedy wrote:
> "Ron Adam" <rrr at ronadam.com> wrote in message 
> news:SXMRe.172$xl6.121 at tornado.tampabay.rr.com...
> 
>>Fredrik Lundh wrote:
>>
>>>Ron Adam wrote:
>>>
>>>>The problem with negative index's are that positive index's are zero
>>>>based, but negative index's are 1 based.  Which leads to a non
>>>>symmetrical situations.
>>>
>>>indices point to the "gap" between items, not to the items themselves.
>>
>>So how do I express a -0?
> 
> 
> You just did ;-) but I probably do not know what you mean.

     b[-1:] = ['Z']    # replaces last item
     b[-1:-0] = ['Z']  # this doesn't work

If you are using negative index slices, you need to check for end 
conditions because you can't address the end of the slice in a 
sequential/numerical way.

b = list('abcdefg')
for x in range(-len(b),-1):
     print b[x:x+2]

['a', 'b']
['b', 'c']
['c', 'd']
['d', 'e']
['e', 'f']
[]


b = list('abcdefg')
for x in range(-len(b),-1):
     if x<-2:
         print b[x:x+2]
     else:
         print b[x:]

['a', 'b']
['b', 'c']
['c', 'd']
['d', 'e']
['e', 'f']
['f', 'g']


>> Which should point to the gap after the last  item.
> 
> The slice index of the gap after the last item is len(seq).
> 
> 
>>>straight indexing returns the item just to the right of the given gap 
>>>(this is
>>>what gives you the perceived assymmetry), slices return all items 
>>>between
>>>the given gaps.
>>
>>If this were symmetrical, then positive index's would return the value
>>to the right and negative index's would return the value to the left.
> 
> As I posted before (but perhaps it arrived after you sent this), one number 
> indexing rounds down, introducing a slight asymmetry.

I didn't see that one, but I agree.  Single index's are asymmetric, 
positive slices with two index's are again symetric, negative slices 
with negative strides or steps are again asymmetric.


>>Have you looked at negative steps?  They also are not symmetrical.
> 
> ???

print a[4:1:-1]    #  6|g| 5|f| 4|e| 3|d| 2|c| 1|b| 0|a| ?
-> edc

print a[-3:-6:-1]  # -1|g|-2|f|-3|e|-4|d|-5|c|-6|b|-7|a|-8|
-> edc

# special case '::'
print a[6::-1]     #  6|g| 5|f| 4|e| 3|d| 2|c| 1|b| 0|a| ?
-> gfedcba

print a[-1:-8:-1]  # -1|g|-2|f|-3|e|-4|d|-5|c|-6|b|-7|a|-8
-> gfedcba



>>All of the following get the center 'd' from the string.
>>
>>a = 'abcdefg'
>>print a[3]         # d   4 gaps from beginning
>>print a[-4]        # d   5 gaps from end
>  
> It is 3 and 4 gaps *from* the left and right end to the left side of the 
> 'd'.  You can also see the asymmetry as coming from rounding 3.5 and -3.5 
> down to 3 and down to -4.

Since single indexing only refers to existing items and aren't used to 
insert between items, this still works even with the slight asymmetry.


>>print a[3:4]       # d
>>print a[-4:-3]     # d
> 
> These are is symmetric, as we claimed.

Yes, no problem here except for addressing the -0th (end gap) position 
without special casing to either a positive index or a[-n:].


>>print a[3:2:-1]    # d   These are symetric?!
>>print a[-4:-5:-1]  # d
>>print a[3:-5:-1]   # d
>>print a[-4:2:-1]   # d
> 
> The pattern seems to be: left-gap-index : farther-to-left-index : -1 is 
> somehow equivalent to left:right, but I never paid much attention to 
> strides and don't know the full rule.

a[start:stop:-1]
a[stop:start]        # exchange index's
a.reverse()          # reverse string

a[4:1:-1]    #  6 |g| 5 |f| 4 |e| 3 |d| 2 |c| 1 |b| 0 |a| ?
a[1:4]       #  ? |a| 0 |b| 1 |c| 2 |d| 3 |e| 4 |f| 5 |g| 6
a.reverse()  # -> edc

Notice the index's are 1 less than with positive strides.


> Stride slices are really a different subject from two-gap slicing.  They 
> were introduced in the early years of Python specificly and only for 
> Numerical Python.  The rules were those needed specificly for Numerical 
> Python arrays.  They was made valid for general sequence use only a few 
> years ago.  I would say that they are only for careful mid-level to expert 
> use by those who actually need them for their code.

I'd like to see those use case's.  I have a feeling there are probably 
better ways to do it now.

Doing a quick search in python24/lib, there are only two places that use 
a negative step or stride value to reverse a sequence.

---------- PICKLE.PY
     return binary[::-1]
     ashex = _binascii.hexlify(data[::-1])

I don't think people would miss negative strides much if they were 
removed. Replacing these case's with reverse() methods shouldn't be that 
difficult.

Cheers,
Ron


> Terry J. Reedy




More information about the Python-list mailing list