for 循环不断迭代字符串中的同一字符两次



我正在尝试创建一个函数,该函数将接受一个字符串并将大写字母转换为小写字母,将小写字母转换为大写字母。

我尝试过制作函数,但问题是如何告诉函数只运行每个字符一次。该函数贯穿字符串,但在将大写/小写更改为大写/小写后,它会将其更改回原来的样子。

def uppertolower (string):
list1 = []
for p,l in enumerate(string):
if p == l.upper():
l = l.lower()
elif p == l.lower():
l = l.upper()
list1.append(l)
return ''.join(list1)

运行了以下内容:

uppertolower('AppLe')

切割结果:AppLe

预期成果: aPPlE

任何帮助将不胜感激。谢谢。

您的循环不需要将penumerate一起使用。enumerate将索引可迭代对象的值,因此始终是一个数字。

你无法比较...

p == l.upper()  # or l.lower()

。成功,因为您将数字与字符串进行比较。我假设根据您的描述,您要检查字母是大写还是小写。您应该将其与自身进行比较:

def uppertolower(string):
list1 = []
for l in string:
if l == l.upper():
l = l.lower()
elif l == l.lower():
l = l.upper()
list1.append(l)
return ''.join(list1)

正如其他答案所指出的那样,您可以通过将elif l == l.lower():更改为简单else:来保存比较,因为即使像数字这样的字符在调用str.upper时也不会改变。

作为旁注,str.swapcase方法的存在是为了字符串完成函数的功能。

另外,我建议您使用更具描述性的变量名称,例如charletter,而不是模棱两可的l(尽管很明显l代表letter,在某些字体中可能会被误认为是大写I或数字1)。

你做错了。无需使用enumerate

def uppertolower (string):
list1 = []
for l in string:
if l == l.upper():
l = l.lower()
else:
l = l.upper()
list1.append(l)
return ''.join(list1)

但是,有一种简单的方法可以做到这一点。使用列表推导式:

def uppertolower(string):
return "".join([l.lower() if l == l.upper() else l.upper() for l in string])

或者更简单地说,使用swapcase

>>> a = "AppLe"
>>> a.swapcase()
'aPPlE'
>>> 

输出:

>>> uppertolower("AppLe")
'aPPlE'
>>> 

p存储当前元素的索引,即l。因此,将stringinteger进行比较是没有意义的。

即使在修复后,也可以通过使用isupperislower函数显着缩短代码。

def uppertolower (x):
list1 = []
for l in x:
if l.isupper():
l = l.lower()
else:
l = l.upper()
list1.append(l)
return ''.join(list1)

最新更新