I just started studying Python and created some kind of task for myself that I'm struggling to solve...
So, I'm on chapter on working with strings (accessing strings by index, changing etc).
My task is - capitalize every odd char of the string. I saw the solution here: Capitalise every other letter in a string in Python?
but I don't like it... wanted to solve this by slices. So what I produced is followig code:
T = 'somesampletexthere'
for i in range(0, len(T[1::2])):
IndexError: string index out of range
Your are right to prefer a slicing solution over those in the linked question. (OTOH, that's a slightly different question because it skips spaces). However, your current code is rather inefficient because it recreates the
T[1::2] slices on every iteration of the
for loop. Also, calling
.lower on single characters is less efficient than calling it on larger strings.
Here's an efficient way to do this using slicing.
T = 'somesampletexthere' R = [''] * len(T) R[::2], R[1::2] = T[::2].upper(), T[1::2].lower() R = ''.join(R) print(R)
Just for fun, here's an alternative strategy that zips the upper & lower case strings together. We use
zip_longest in Python 3) so we can handle strings that have an odd length.
from itertools import izip_longest T = 'somesampletexthere' R = ''.join([c for t in izip_longest(T[::2].upper(), T[1::2].lower(), fillvalue='') for c in t]) print(R)
Although this version does it in one line I prefer my first version: I find it more readable, and it's probably a little faster.