字符串是不可变的,所以你不能从字面上删除字符,但你可以创建一个跳过这些字符的新字符串。
最简单的方法是:
s = ''.join(ch for ch in s if not ch.isupper())
如果你想在没有for的情况下出于某种原因(比如作业要求),我们可以将其作为显式循环写出来,然后将其转换为while。所以:
result = []
for ch in s:
if not ch.isupper(): result.append(ch)
s = ''.join(result)
要更改循环,我们必须手动设置并接下来使用迭代器,但是使用普通的int作为索引而不是迭代器可能更容易理解:
result = []
i = 0
while i < len(s):
ch = s[i]
if not ch.isupper(): result.append(ch)
i += 1
s = ''.join(result)
当然,这更加冗长,效率稍低,容易出错,但除此之外基本相同,它符合您的奇怪要求。
在现实生活中,可能有更好的方法可以做到这一点 - 例如,如果您只关心ASCII上限,str.translate带有从全部大写到无的地图应该非常快 - 但我认为你的老师没有你希望你在那些方向思考,他们希望你明确地思考循环。 (当然在str.translate或re.sub等中有一个循环,该循环只是隐藏在你看不到它的封面下。)
如果你需要对列表中的多个字符串执行此操作,则将其包装在函数中,并使用理解将其应用于列表中的每个字符串 - 或者可以将其作为循环语句写出来,如果您愿意,将其转换为while循环,方式完全相同。例如:
def remove_caps(s):
result = []
i = 0
while i < len(s):
ch = s[i]
if not ch.isupper(): result.append(ch)
i += 1
return ''.join(result)
strings = ['aBC', 'Abc', 'abc', '']
new_strings = []
i = 0
while i < len(strings):
new_strings.append(remove_caps(strings[i]))
i += 1