Python使用strip移除列表元素尾部特殊字符运行结果不符合预期问题
你代码的核心问题出在内层循环的赋值逻辑,具体原因如下:
核心错误点
- 内层循环始终用
enumerate返回的原始字符串word做处理,每次赋值都会覆盖前一次特殊字符的处理结果。
你的特殊字符遍历顺序是@ → ! → $ → , → :,我们拿第一个元素wonderland@举例:
遍历第一个字符
@时,word.strip('@')得到无后缀的wonderland,赋值给a[0];
遍历第二个字符!时,你用的还是原始的word = 'wonderland@'执行strip('!'),结果还是wonderland@,直接覆盖了上一步的正确结果;
后续遍历$/,/:都不会处理@,最终a[0]就保留了原始的wonderland@。
剩下的alice,、in!$都是同样的逻辑:对应要移除的特殊字符不是遍历顺序的最后一位,处理完就被后续的原始值操作覆盖了。只有最后一个元素book:对应的特殊字符:是遍历顺序的最后一位,最后一次赋值刚好是处理后的结果,所以只有它符合预期。
另外额外说明:strip会同时移除字符串首尾的目标字符,如果你只需要移除尾部的特殊字符,应该用rstrip方法。
修复方案
不需要嵌套循环,直接把所有要移除的特殊字符一次性传给rstrip即可:
a = ['wonderland@', 'alice,', 'in!$', 'book:'] for index, word in enumerate(a): a[index] = word.rstrip('@!$,:') print(a) # 输出:['wonderland', 'alice', 'in', 'book']
如果必须保留嵌套循环的写法,要基于修改后的临时变量处理,不要每次都用原始的word:
a = ['wonderland@', 'alice,', 'in!$', 'book:'] for index, word in enumerate(a): modified = word for ch in '@!$,:': modified = modified.rstrip(ch) a[index] = modified print(a)
内容的提问来源于stack exchange,提问作者Zy Taga
相关产品推荐
相关产品推荐

