将字符串中的一些小写字母改为大写

11
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

我了解在第一次迭代中,字符串s仅变成了第一个字符,特定情况下是大写字母"I"。但是,我已经尝试过不使用"s =",而是使用 swapchcase(),但它并没有生效。

基本上,我正在尝试使用Python 3.X打印s字符串,并将索引字母大写。

2个回答

21

在Python中,字符串是不可变的,因此您需要创建一个新的字符串对象。一种方法是:

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)))

打印

I like StackOverflow and Python

7

这是我的解决方案。它不会遍历每个字符,但我不确定将字符串转换为列表再转回字符串是否更有效率。

>>> 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'

在这种情况下,您不需要使用 set()string = list(..) 是具有误导性的,您可以使用 chars(更少误导性)。 - jfs
是的,使用set是不必要的,但如果OP想添加索引怎么办?对于这个目的,使用set是有意义的。 - Tyler Crompton
但如果索引已经存在,使用列表将使该索引的工作加倍。使用集合是有道理的。从set的文档字符串中可以看到:“构建一个无序的唯一元素集合。”它不需要被排序,并且每个索引都应该是唯一的,因为重复是没有意义的。 - Tyler Crompton
想象一下,如果你使用.swapcase()而不是.upper(),那么list()set()的索引将产生不同的结果。另外,“string = ''.join(string)”看起来很奇怪,在这种情况下“string = ''.join(chars)”可能更好。 - jfs
当你指定要大写的索引时,为什么要使用swapcase()?为什么要第二次添加索引以实际删除它?这在语义上是不正确的,而set是适当的数据结构。至于更改变量名称,已完成。谢谢 :) - Tyler Crompton
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接