【问题标题】:Removing White Spaces in a Python String删除 Python 字符串中的空格
【发布时间】:2015-11-24 06:02:03
【问题描述】:

一般问题是从python字符串中删除所有多余的空格,以便每个单词之间只有一个空格,并且字符串的开头或结尾没有空格。

例如, “Hello to the world”将返回为“Hello to the world”

我们不允许使用 split 命令,或除基本字符串运算符(长度和连接)以及 if 和 while 命令之外的任何命令。

我已经编写了我的程序,以便它删除字符串开头的空格以及单词之间的额外空格,但是,如果我在输入字符串的最后一个单词之后还有一个空格,则程序会返回一个错误“索引[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 的缺乏经验。

【问题讨论】:

  • 破坏帖子不是处理此类问题的方法。使用“联系我们”表格直接联系 SE 以删除帖子。
  • 嗨,克里斯,我使用“联系我们”表格联系了 SE,但我需要尽快删除该帖子。有人告诉我,我必须手动删除它,因为正如我所说,行为准则存在问题。如果这是我自己创建的帖子,我不确定是否可以将其描述为“故意破坏”,但有人告诉我必须删除它。我希望在 SE 更改查看我的消息后,该线程本身将被删除。
  • 这仍然是破坏行为。当您发布问题时,您授予 SE 使用该帖子的权利。虽然您可以要求将其移除,但同时不能破坏它。

标签: python


【解决方案1】:

实际上有一个简单而巧妙的解决方法。改变

if s[i]==' ' and i+1<len(s):

到...

if i<len(s) and s[i]==' ':

这是有效的,因为如果在任何时候遇到虚假值,Python 会短路 and。这意味着在i&lt;len(s) 评估为 False 并且 Python 遇到 and 之后,它将立即转到 elifelse 子句(如果有的话)。因此,后半部分永远不会被评估,所以没有IndexError

现在,这个程序不能完美运行。 还有其他问题,但由于这是家庭作业,我不愿意提供更多帮助。除了这个提示:你需要另一个 while 循环。

【讨论】:

  • 这似乎也不起作用。该程序仍然为空,不幸的是没有返回任何字符串。
  • 我不明白你的意思。该程序(几乎)在我的计算机上运行,​​它确实返回一个字符串。或许您需要print 结果。
【解决方案2】:

您需要在另一个地方检查您的 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)

【讨论】:

  • 如果我把它改成 (i+1)
  • 等一下,我正在运行它,我会在几分钟内更新
  • @pythonrookie 现在试试这个
  • 非常感谢,这就像一个魅力。非常感谢您的帮助,您不知道您刚刚为我解救了多少压力。
  • s[len(s)-1]可以是s[-1],s[0:len(s)-1]可以是s[:-1]
【解决方案3】:

这似乎工作得很好。 一探究竟。 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】:

    使用一些递归

    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
    

    【讨论】:

      【解决方案5】:

      这是您的实现结构,以及所需的更改:

      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]
      

      享受吧。

      【讨论】:

        猜你喜欢
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        • 2013-09-25
        • 2014-02-11
        • 1970-01-01
        • 2011-09-21
        相关资源
        最近更新 更多