2015-11-24 182 views
0

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

例如, “你好世界”将返回为“你好世界”

我们不允许使用拆分命令,或者除了基本的字符串操作符的任何命令(长度和concantenation)和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的缺乏经验。

+1

捣毁后不应对这样的问题的方式。直接联系SE,使用“联系我们”表单来删除帖子。 – ChrisF

+0

嘿克里斯,我使用“联系我们”表单联系了SE,但我需要尽快删除帖子。我被告知我必须手动删除它,因为正如我所说,行为准则问题。我不确定如果它是我创建的我自己的帖子是否可以被描述为“破坏行为”,但我被告知我必须删除它。我希望线程本身会被删除,一旦SE有改变,查看我的消息。 – pythonrookie

+0

这仍然是破坏行为。当您发布问题时,您授予SE使用该帖子的权利。虽然您可以要求将其移除,但您无法在此期间破坏它。 – ChrisF

回答

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]==' ': 
      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) 
+0

如果我将它更改为(i + 1) pythonrookie

+0

坚持我正在运行它,我会在几分钟内更新 –

+0

@pythonrookie现在试试这个 –

2

其实是有一个简单而巧妙的修复。更改

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

到...

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

这工作,因为Python的短路,如果falsy值在任何时候遇到and。这意味着在i<len(s)评估为False并且Python遇到and后,它将立即转到elifelse子句(如果有)。因此,下半场永远不会被评估,所以没有IndexError

现在,这个程序并不完美。有其他问题,但由于这是一项家庭作业,我不愿提供任何帮助。除了这个提示:你需要另一个while循环。

+0

这似乎并不奏效。该程序仍为空,不幸的是不返回任何字符串。 – pythonrookie

+0

我不明白你的意思。该程序(几乎)在我的电脑上工作,它*会*返回一个字符串。也许你需要“打印”结果。 –

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] 

享受。

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 ')) 
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