change some lowercase letters to uppercase in string
65,861
Solution 1
Strings are immutable in Python, so you need to create a new string object. One way to do it:
indices = set([0, 7, 12, 25])
s = "i like stackoverflow and python"
print("".join(c.upper() if i in indices else c for i, c in enumerate(s)))
printing
I like StackOverflow and Python
Solution 2
Here is my solution. It doesn't iterate over every character, but I'm not sure if converting the string to a list and back to a string is any more efficient.
>>> indexes = set((0, 7, 12, 25))
>>> chars = list('i like stackoverflow and python')
>>> for i in indexes:
... chars[i] = chars[i].upper()
...
>>> string = ''.join(chars)
>>> string
'I like StackOverflow and Python'
Author by
Hanan N.
Updated on July 29, 2020Comments
-
Hanan N. over 3 years
index = [0, 2, 5] s = "I am like stackoverflow-python" for i in index: s = s[i].upper() print(s) IndexError: string index out of range
I understand that in the first iteration the string,
s
, become just the first character, an uppercase "I" in this particular case. But, I have tried to do it without the "s = " , usingswapchcase()
instead, but it's not working.Basically, I'm trying to print the
s
string with the index letters as uppercase using Python 3.X -
jfs over 12 yearsyou don't need
set()
in this case.string = list(..)
is misleading, you could usechars
(less misleading). -
Tyler Crompton over 12 yearsTrue. I actually optimized the solution and converting to a list is no longer needed. Thanks, though. :)
-
Tyler Crompton over 12 yearsAnd yes, using set is unnecessary but what if the OP want to add an index? A set would make sense for this purpose.
-
jfs over 12 years1. from
MutableString
docstring: A faster and better solution is to rewrite your program using lists. 2.indexes = [0, 2, 5]
... OP want to add an index ...indexes.append(1)
. -
Tyler Crompton over 12 yearsBut if an index already exists, you're doubling the work for that index. It just makes sense to use a set. From
set
's docstring: "Build an unordered collection of unique elements." It doesn't need to be ordered and every index should be unique since it wouldn't make sense to have duplicates. -
Tyler Crompton over 12 yearsRolled back. I found some benchmarking and this looks to be quickest.
-
jfs over 12 yearsimagine you use
.swapcase()
instead of.upper()
thenlist()
andset()
indexes yield different results. btw,string = ''.join(string)
looks awkwardstring = ''.join(chars)
might be better in this case. -
Tyler Crompton over 12 yearsWhy use
swapcase()
when you're specifying the indexes to be capitalized? Why would you add an index a second time to practically remove it? It's semantically incorrect andset
is the proper data structure. As far as changing, the name of the variable, done. Thanks. :)