2015-11-24 180 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