Python实现单词首字母大写函数出现多余空格问题求助
Python实现单词首字母大写函数出现多余空格问题求助
嘿,我正在做HackerRank的一道Python题,题目要求是:给定一个由空格分隔单词的输入字符串,比如alex mcqueen timothy karl logan 12abcd(这个例子里因为第一个字符不是字母,所以要保持原样),需要把每个单词的首字母(如果是字母的话)大写,然后返回修改后的字符串。
我写了下面这段Python函数,虽然输出的内容是对的,但不知道为啥拼接后的字符串末尾会多出多余的空格:
def solve(s): ret = "" words = s.split(" ") for word in words: # check if the first letter is an alphabet if word[0].isalpha(): first = word[0].upper() # capitalize the first character ret += first # add it to our string for i in range(1, len(word)): ret += str(word[i]) else: # if the first letter is not an alphabet for i in range(0, len(word)): # basically loop from the beginning ret += str(word[i]) cnt = len(words) # this is the number of words in the sentence idx = 0 y = "" for i in range(len(ret)): if i != 0 and ret[i].isupper() and idx != cnt: y+= " " # add a space and then the letter y+= ret[i] idx +=1 # increment the counter else: # handle the exceptions here including a mid word starting with a number y += ret[i] return y
问题分析
你的代码逻辑绕了个大弯:先把所有单词处理后拼接成无空格的字符串ret,再重新遍历ret试图插入空格,这一步的判断逻辑很容易出错——比如当处理最后一个单词的首字母时,idx != cnt的条件可能误触发空格添加,或者遍历到字符串末尾时因为逻辑漏洞多加了空格。而且这种方式不仅效率低,还容易因为特殊情况(比如单词里中间出现大写字母)出问题。
更简洁的解决方案
其实我们可以换个思路:先拆分每个单词,单独处理每个单词的首字母,最后用空格把处理好的单词拼接起来——" ".join()方法会自动在单词之间加空格,绝对不会在末尾多出空格,完美解决你的问题。
而且处理单个单词的逻辑也可以简化,不需要逐个字符拼接:
完整函数(可读性优先)
def solve(s): # 按空格拆分单词,保留空字符串(处理连续空格的情况) words = s.split(" ") processed_words = [] for word in words: # 处理空单词(比如连续空格产生的) if not word: processed_words.append(word) continue # 如果首字符是字母,就大写首字母+保留后面所有字符;否则直接保留原单词 if word[0].isalpha(): processed_word = word[0].upper() + word[1:] else: processed_word = word processed_words.append(processed_word) # 用空格拼接所有处理后的单词 return " ".join(processed_words)
精简版(列表推导式)
如果追求代码简洁,也可以写成一行:
def solve(s): return " ".join( word[0].upper() + word[1:] if word and word[0].isalpha() else word for word in s.split(" ") )
为什么这个方案能解决空格问题?
" ".join(列表)的逻辑是:把列表里的每个元素用单个空格连接起来,只会在元素之间加空格,列表的最后一个元素后面绝对不会加空格,完全避免了你原来代码里手动加空格的逻辑漏洞。
内容来源于stack exchange
相关产品推荐
相关产品推荐

