【问题标题】:How do I remove spaces in a string using a loop in python?如何使用python中的循环删除字符串中的空格?
【发布时间】:2017-06-16 13:10:44
【问题描述】:
def onlyLetters(s):
    for i in range(len(s)):
        if s[i] == " ":
           s = s[:i] + s[i+1:]
           return s
        return s

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

例如,如果我有字符串“Hello how are you”,它会返回“Hellohow are you”。我希望它再次检查字符串并删除另一个空格,并继续这样做,直到没有空格为止。如何修复此代码?

【问题讨论】:

  • your_string.replace(' ', '') 怎么样?
  • 只需从 if 条件中删除 return s
  • 如果我删除 if 条件的 {return s} 对我有用
  • 如果我删除第一个 return s,它会说“字符串索引超出范围”

标签: python string for-loop


【解决方案1】:

您的代码在第一个空格被替换后停止,因为您已经告诉它这样做。你在循环中有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

【讨论】:

  • 删除第一个 return 后,我得到:IndexError: string index out of range
  • 还有这个:----> 3 if s[i] == " ":
  • IndexError 仅应在您正向循环时出现。如果你反向循环,你就不会有这个问题。
  • 发生异常是因为每次删除空格时字符串都会变短。如果您正在向前迭代,您将继续找到不再存在的最后一个索引。反向迭代时,以始终有效的最小索引结束。
  • 不,range(len(s)) 只评估一次len(s),然后从中创建一个range 对象(如果您使用的是 Python 2,则为值列表)。对于反向范围,范围在到达 -1 之前停止,就像 range(5) 在到达 5 之前停止一样。
【解决方案2】:

只需对字符串使用 python replace() 方法。

s.replace(" ","")

【讨论】:

  • 我不能使用 s.replace,我需要在没有任何类似功能的情况下这样做,只能循环
  • 您的代码的问题是 if 条件中的返回方法。它在处理完第一个空格后停止执行该方法。删除它,你会很高兴的。
  • 谢谢,但它仍然无法正常工作,我收到一个错误:“字符串索引超出范围”
  • 好的,我明白了这个问题。检查我的答案
【解决方案3】:

如果要删除所有空格,请使用 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()))))

【讨论】:

    【解决方案4】:

    这有点难说,因为你的例子中的缩进很难理解。但是在我看来,在您遇到并删除第一个空格之后,您正在返回 s。因此,您只有在返回之前有机会删除一个空格。

    尝试只在退出 for 循环后返回 s。

    【讨论】:

      【解决方案5】:

      你可以s.replace(" ", "")。这将占用您所有的空格 (" ") 并将其替换为空 (""),从而有效地删除空格。

      【讨论】:

      • 不能使用 s.replace。没有那个我需要这样做
      【解决方案6】:

      您在第一次出现 "," 后返回函数,这意味着它完全退出循环和函数。这就是为什么它只适用于第一个逗号。

      【讨论】:

        【解决方案7】:

        试试这个,

        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】:

        如果您只想使用自己的代码,请尝试运行:

        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(" ","")
        

        【讨论】:

        • 您在第二个代码示例中的 return 语句似乎完全放错了地方...
        • 不是真的...str 是不可变的,所以你想return s.replace(' ', '')
        • 嗯,是的,你是对的。我现在做出了改变。感谢您的及时回复。
        【解决方案9】:
        def remove_spaces(text):
            text_with_out_spaces='';
            while text!='':
                next_character=text[0];
                if next_character!=' ':
                    text_with_out_spaces=text_with_out_spaces +next_character;
                text=text[1:];
            return text_with_out_spaces
        
        print remove_spaces("Hi Azzam !! ?");
        

        【讨论】:

          猜你喜欢
          • 2018-01-04
          • 1970-01-01
          • 2014-01-26
          • 1970-01-01
          • 1970-01-01
          • 2021-11-29
          • 2015-04-21
          • 2011-09-30
          相关资源
          最近更新 更多