def onlyLetters(s):
for i in range(len(s)):
if s[i] == " ":
s = s[:i] + s[i+1:]
return s
return s
为什么我的上述循环不起作用?好像它只做了一次。
例如,如果我有字符串“你好,你怎么样”,那么它将返回“ Hellohow是你”。我希望它再次检查字符串并删除另一个空格,并继续这样做,直到没有剩余空格。我该如何修复此代码?
答案 0 :(得分:4)
您的代码在更换第一个空格后停止,因为您已将其告知。循环中有return s
,当达到该值时,循环的其余部分将被放弃,因为函数退出。你应该完全删除那一行。
但是,还有另外一个问题,与你如何编制索引有关。当您在range(len(s))
上为索引进行迭代时,您将转到原始字符串的长度。但是,如果您删除了一些空格,那么最后几个索引将不再有效(因为修改后的字符串更短)。如果一行中有两个空格(如"foo bar"
),则会出现另一个类似的问题。您的代码只能替换第一个代码。删除第一个空格后,第二个空格将向上移动并处于相同的索引处,但循环将移动到下一个索引而不会看到它。
您可以通过两种不同的方式解决此问题。最简单的解决方法是以相反的顺序循环索引。删除前面的空格不会改变前面空格的索引,即使字符串缩小,数字上最小的索引也总是有效。
def onlyLetters(s):
for i in range(len(s)-1, -1, -1): # loop in reverse order
if s[i] == " ":
s = s[:i] + s[i+1:]
return s
另一种方法是放弃索引的for
循环,并在手动更新索引变量时使用while
循环:
def onlyLetters(s):
i = 0
while i < len(s):
if s[i] == " ":
s = s[:i] + s[i+1:]
else:
i += 1
return s
答案 1 :(得分:2)
只需对字符串使用python replace()方法。
s.replace(" ","")
答案 2 :(得分:1)
这有点难以辨别,因为你的例子中的缩进很难理解。但它看起来像你遇到并删除第一个空间后,你回来了。所以你只有机会在返回之前删除一个空格。
尝试仅在退出for循环后返回s。
答案 3 :(得分:1)
你可以s.replace(" ", "")
。这将占用您的所有空格(" "
)并将其替换为空(""
),从而有效地删除空格。
答案 4 :(得分:0)
您在第一次出现","
后返回该函数,这意味着它将完全退出循环和函数。这就是为什么它只适用于第一个逗号。
答案 5 :(得分:0)
如果您只想使用自己的代码,请尝试运行:
def onlyLetters(s):
for i in range(len(s)):
if s[i] == " ":
s = s[:i] + s[i+1:]
return s
你可以使用或更好:
def onlyLetters(s):
return s.replace(" ","")
答案 6 :(得分:0)
如果要删除所有空格,请使用str.replace():
sentence = ' Freeman was here'
sentence.replace(" ", "")
>>> 'Freemanwashere'
如果要删除前导和结尾空格,请使用str.strip():
sentence = ' Freeman was here'
sentence.strip()
>>> 'Freeman was here'
如果要删除重复的空格,请使用str.split():
sentence = ' Freeman was here'
" ".join(sentence.split())
>>> 'Freemanwashere'
如果你还想删除unicode中存在的所有其他奇怪的空格字符,你可以使用re.sub与re.UNICODE争论:
text = re.sub(r"\s+", "", text, flags=re.UNICODE)
或类似的东西,它会处理你没想到的任何空格字符:
>>> import re
>>> re.sub(r'\s+', '', 'Freeman was here')
'Freemanwashere'
如果您不想使用replace()
或join()
之类的内容,则可以执行此操作:
def filter(input):
for i in input:
yield " " if i in " ,.?!;:" else i
def expand(input):
for i in input:
yield None if i == " " else object(), i
def uniq(input):
last = object()
for key, i in input:
if key == last:
continue
yield key, i
def compact(input):
for key, i in input:
yield i
yourText = compact(uniq(expand(filter(input()))))
答案 7 :(得分:0)
试试这个,
def onlyLetters(s):
length=len(s)
i=0
while(i<length):
if s[i] == " ":
s = s[:i] + s[i+1:]
length=len(s)
else
i+=1
return s
答案 8 :(得分:0)