Flubbed it in the second interation through the string: range error... HOW?

MRAB python at mrabarnett.plus.com
Wed May 29 10:59:50 EDT 2024


On 2024-05-29 15:32, Thomas Passin via Python-list wrote:
> On 5/29/2024 8:55 AM, Kevin M. Wilson wrote:
>> Please recall, I said the format for the email failed to retain the 
>> proper indents.
>> I'll attach a picture of the code!
>> Purpose; to uppercase every other letter in a string.
>> 
>> Thanks all, KMW
> 
> Simpler is good, and readability is good.  For a simple conversion that
> has a little touch of generality:
> 
> s1 = 'this is a test'
> def convert(i, ch):
>       return ch.upper() if i % 2 else ch
> 
> result = ''.join([convert(i, ch) for i, ch in enumerate(s1)])
> print(result)  # tHiS Is a tEsT
> 
[snip]
Small mistake there. The original code converted to uppercase on even 
indexes, whereas your code does it on odd ones.

> However, this has a weakness: what to do about spaces.  Should they be
> counted among the characters to be uppercased? or should they not be
> included in the count of the alternation?  If you want to uppercase
> every other letter that is not a space, things become a little more
> complicated.  And then do you want this to apply to all whitespace or
> only spaces?
> 
> If you want to skip changing spaces, then you need to track the state of
> converted characters in some way.  It would probably be easier (and more
> readable) to use a "for x in t:" construction:
> 
> def convert(convert_this, ch):
>       """Convert character ch if convert_this is True.
>       Don't convert spaces.
>       """
>       if convert_this:
>           if ch == ' ':
>               return (convert_this, ch)
>           elif convert_this:
>               return (False, ch.upper())
>       return (True, ch)
> 
> convert_next = False
> result = ''
> for ch in s1:
>       convert_next, ch = convert(convert_next, ch)
>       result += ch
> print(result)  # tHiS Is A TeSt
> 
> There could be even more complications if you allow non-ascii characters
> but you were asking about processing character by character so I won't
> get into that.
> 
> (You haven't specified the problem in enough detail to answer questions
> like those).
> 
[snip]




More information about the Python-list mailing list