Removing White Spaces in a Python String
一般的问题是从python字符串中删除所有多余的空格,以便每个单词之间只有一个空格,并且字符串的开头或结尾没有空格。
例如,
'Hello to the world'将以'Hello to the world'的形式回归
除了基本字符串运算符(长度和连续)以及if和while命令之外,我们不允许使用split命令或任何命令。
我编写了我的程序,以便它删除字符串开头的空格以及单词之间的额外空格,但是,如果我在输入字符串中的最后一个单词之后有一个空格,程序将返回错误"index [ 我]超出范围"。
这是我的计划:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def cleanstring (s): i=0 while s[i]==' ': i=i+1 s=s[i:len(s)] i=0 while i<len(s): if s[i]!=' ': i=i+1 else: if i<len(s) and s[i]==' ': i=i+1 if s[i]==' ' and i+1<len(s): s=s[0:i]+s[i+1:len(s)] i=0 return(s) |
希望有人可以帮我确定它有什么问题。 好像我已经尝试了一切,但我知道这只是我对python的经验不足。
实际上有一个简单而聪明的解决方案。更改
1 | if s[i]==' ' and i+1<len(s): |
至...
1 | if i<len(s) and s[i]==' ': |
这是有效的,因为如果在任何点遇到假值,Python就会短路
现在,这个程序并不完美。还有其他问题,但由于这是一项家庭作业,我不愿意提供更多帮助。除了这个提示:你需要另一个while循环。
使用一些递归
1 2 3 4 5 6 7 8 9 10 | def cleanString(word): if word[0]=="": if len(word)>1: return cleanString(word[1:]) return word[1:] elif len(word)>1: return word[0]+cleanString(word[1:]) return word print cleanString(" abcd ") =="abcd" # True print cleanString(" abcd ") # abcd |
这似乎工作得很好。
看看这个。
repr()只是在引号中给出字符串,以便查看单词前后的实际空格数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def cleanstring (s): hit_letter = False space_counter = 0 tmp = list() for letter in s: if letter.isalpha(): space_counter = 0 hit_letter = True tmp.append(letter) print letter elif hit_letter: space_counter += 1 if space_counter < 2: tmp.append(letter) return ''.join(tmp[:-1]) print repr(cleanstring(' Hi to the world ')) |
这是您的实现结构,包含所需的更改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def cleanstring (s): i=0 while s[i]==' ': i=i+1 s=s[i:len(s)] i=0 while i<len(s): if s[i]!=' ': i=i+1 else: if i<len(s) and s[i]==' ': i=i+1 if i<len(s) and s[i]==' ': s=s[0:i]+s[i+1:len(s)] i=0 if s[-1] == ' ': s = s[:-1] return(s) |
改变的是:
1 | if s[i]==' ' and i+1<len(s): |
至:
1 | if i<len(s) and s[i]==' ': |
但是这最终会留下一个空间,所以
1 2 | if s[-1] == ' ': s = s[:-1] |
请享用。
您需要在另外一个地方检查您的i是否在范围内。试一试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | def cleanstring(s): i=0 while s[i]==' ': i=i+1 s=s[i:len(s)] i=0 while i<len(s): if s[i]==' ': if (i+1)<len(s) and s[i+1]==' ': s=s[0:i]+s[i+1:len(s)] else: i=i+1 else: i=i+1 if s[len(s)-1]==' ': s=s[0:len(s)-1] return(s) |