一般的问题是从python字符串中删除所有多余的空格,以便每个单词之间只有一个空格,而字符串的开头或结尾没有空格。
例如, 'Hello to the world'将以'Hello to the world'的形式返回
我们不允许使用split命令,或除基本字符串运算符(长度和连接)以及if和while命令之外的任何命令。
我编写了我的程序,以便删除字符串开头的空格以及单词之间的额外空格,但是,如果输入字符串中的最后一个单词后面甚至有一个空格,则程序返回错误“index [i]超出范围”。
这是我的计划:
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的经验不足。
答案 0 :(得分:2)
实际上有一个简单而聪明的修复方法。变化
if s[i]==' ' and i+1<len(s):
为...
if i<len(s) and s[i]==' ':
这是有效的,因为如果在任何点遇到假值,Python会短路and
。这意味着在i<len(s)
评估为False并且Python遇到and
之后,如果有elif
或else
条款,它将立即转到IndexError
或DownloadManager.COLUMN_TITLE
条款。因此,永远不会评估后半部分,因此没有sub('(?<=\\d)-(?=\\d)', '$', a, perl=TRUE)
#[1] "1" "1.5" "-2" "3$4.5" "-1" "5$7.5" "3"
。
现在,这个程序并不完美。 其他问题,但由于这是一项家庭作业,我不愿意提供更多帮助。除了这个提示:你需要另一个while循环。
答案 1 :(得分:1)
您需要在另外一个地方检查您的i是否在范围内。试一试:
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)
答案 2 :(得分:1)
这是您的实施结构,包含所需的更改:
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)
改变的是:
if s[i]==' ' and i+1<len(s):
要:
if i<len(s) and s[i]==' ':
但是这会在最后留下一个空间,所以
if s[-1] == ' ':
s = s[:-1]
享受。
答案 3 :(得分:1)
这似乎工作得很好。 看看这个。 repr()只是在引号中给出字符串,以便查看单词前后的实际空格数。
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 '))
答案 4 :(得分:1)
使用一些递归
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