如何在python中使用循环删除字符串中的空格?

时间:2017-01-31 07:22:20

标签: python string for-loop

def onlyLetters(s):
    for i in range(len(s)):
        if s[i] == " ":
           s = s[:i] + s[i+1:]
           return s
        return s

为什么我的上述循环不起作用?好像它只做了一次。

例如,如果我有字符串“你好,你怎么样”,那么它将返回“ Hellohow是你”。我希望它再次检查字符串并删除另一个空格,并继续这样做,直到没有剩余空格。我该如何修复此代码?

9 个答案:

答案 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)

def post_details(request, slug):
  posts = Posts.objects.get(pk=slug)
  return render(request, 'posts/post_details.html', {'posts': posts})

the output screenshot