python - 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')
实际结果:AppleLe
预期结果:苹果
任何帮助将不胜感激。谢谢。
解决方案
您的循环不需要使用p
with enumerate
。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
方法存在于字符串以完成您的函数所做的事情。
另外,我建议您使用更具描述性的变量名称,例如char
orletter
代替模棱两可的名称l
(尽管l
代表相当明显,但在某些字体中letter
可能会被误认为是大写字母I
或数字)。1
推荐阅读
- c++ - main.cpp:1:10:致命错误:opencv2/highgui.hpp:没有这样的文件或目录
- python - 以 django 形式设置默认数据
- javascript - 打印内容
- c++ - 如何使用 duktape 创建插入的对象?
- php - 即使在所有测试完成之前,如何显示失败的 PHPUnit 测试的名称
- python - 优化覆盖类型问题的Python实现
- haskell - haskell 将字符串转换为 Int
- shiny - rmarkdown flexdashboard images 文件夹会自行删除
- c - getline() 在使用 fork() 时重复读取文件
- jms - 调用 setRollbackOnly 后 JMS 消息传递延迟