Python中如何让enumerate遍历时不将空格计入索引计数
奇偶位字母大小写转换的空格计数问题修复
问题复现
目标需求:编写接收句子输入的函数,将偶数位置的字母转为大写,奇数位置的字母转为小写,非字母字符不参与位置计数。
原有实现代码:
def func(st): res = [] for index, c in enumerate(st): if index % 2 == 0: res.append(c.upper()) else: res.append(c.lower()) return ''.join(res) print(myfunc(something))
输入"Hello my guy"时,实际输出为"HeLlO My gUy",不符合预期输出"HeLlO mY gUy",根因是直接使用字符串整体索引做判断,空格被计入位置序号,打乱了字母本身的奇偶位排序;另外代码存在笔误:定义的函数名为func,调用时写为myfunc,会触发名称错误。
修复方案
单独维护仅对字母生效的位置计数器,遍历字符时对非字母字符直接原样保留、不更新计数器,仅在处理字母时根据计数器值做大小写转换,处理完成后更新计数器。
修复后可运行代码:
def func(st): res = [] letter_index = 0 # 仅统计字母的位置计数器 for c in st: # 非字母字符直接追加,不占用计数位 if not c.isalpha(): res.append(c) continue # 按字母的奇偶位置转换大小写 if letter_index % 2 == 0: res.append(c.upper()) else: res.append(c.lower()) letter_index += 1 return ''.join(res) # 测试用例 print(func("Hello my guy"))
运行输出:
HeLlO mY gUy
逻辑说明
- 处理
Hello段时,5个字母依次按索引0-4转换,得到HeLlO,此时字母计数器值为5 - 遇到第一个空格时直接追加,计数器保持5不变
- 后续第一个字母
m对应计数器值5(奇数位),转为小写m,计数器更新为6 - 下一个字母
y对应计数器值6(偶数位),转为大写Y,得到mY片段,和预期一致 - 后续空格、
guy段逻辑同理:空格不参与计数,字母按独立计数器值做大小写转换,最终输出完全符合要求。
内容的提问来源于stack exchange,提问作者Somebody
相关产品推荐
相关产品推荐

