Python中仅打印指定字母开头单词的代码错误排查
问题分析与解决
问题描述
给定字符串 st = 'Print only the words that start with s in this sentence',要求仅打印其中以s开头的单词,预期输出为start、s、sentence。
初始错误代码及问题
最初编写的代码如下:
space = ' ' before = space indexCount = 0 for letter in st: if before == space and (letter == 's' or letter == 'S'): print(st[indexCount:st[indexCount:].find(' ')]) before = letter indexCount += 1
输出仅显示两行空行和sentenc,无法正确打印start和s,核心问题有两点:
- 索引偏移错误:
st[indexCount:].find(' ')返回的是子串内空格的位置,直接作为切片结束索引时,相当于从indexCount开始截取到原字符串的该位置(远小于indexCount),导致截取空字符串(比如单个s的情况)。 - 未处理最后一个单词:最后一个单词
sentence后没有空格,find(' ')返回-1,切片变成st[indexCount:-1],会丢失最后一个字符,得到sentenc。
简洁正确解法
使用split()方法可以快速解决问题,该方法会将字符串按空格分割为单词列表,遍历判断每个单词首字符即可:
for word in st.split(): if word[0] == 's': print(word)
修正后的代码及知识点总结
修正后的代码解决了索引偏移和最后一个单词的问题:
st = 'Print only the words that start with s in this sentence' space = ' ' before = space indexCount = 0 for letter in st: if before == space and (letter == 's' or letter == 'S'): if st[indexCount:].find(' ') == -1: endIndex = None else: endIndex = st[indexCount:].find(' ') + indexCount print(st[indexCount:endIndex]) before = letter indexCount += 1
从中学到两个关键知识点:
- 子串的索引是相对于自身的,截取原字符串的对应部分时,需要将子串内的偏移量加上原字符串的起始索引,得到正确的结束位置。
find()方法找不到目标字符时会返回-1,此时需要特殊处理(比如用None作为切片结束索引,直接截取到字符串末尾)。
内容的提问来源于stack exchange,提问作者FrostedPeak
相关产品推荐
相关产品推荐

