2012-10-01 551 views
1

我看了很多以前提出的問題,但仍然找不到任何可以幫助我的東西。 這是我寫的一個代碼,用於反轉一個句子。 我可以使用split()函數,但是我試圖在沒有它的情況下做。Python:字符串索引超出範圍

s='abcdef ghij klmn op qrst uv w xy z' 
s=s[::-1] 
print s 
j=0 
p='' 
while(j<len(s)): 
    a='' 
    while(s[j]!=''): 
     a=a+s[j] 
     j+=1 
    p.append(a[::-1]) 
    j+=1 
print p 

它給了我一個字符串索引在範圍括號內的範圍錯誤。爲什麼?

非常感謝您的幫助。

+1

您的代碼不太可讀。考慮使用更多的描述性名稱,以及更多的運算符空白。 –

+2

'while(s [j]!='')'會在'j'小於'len(S)'時評價爲false?如果不是,當'j'等於'len(S)'時......它會崩潰! –

+0

您創建了很多中間字符串。你應該使用列表。 – moooeeeep

回答

1

你的問題是這個內循環:

while(s[j]!=''): 
    a=a+s[j] 
    j+=1 

這個循環允許j超過的s的長度,你可能想在這裏添加一個附加條件,以防止這種情況(我也刪除了不必要的括號內):

while j < len(s) and s[j] != '': 
    a=a+s[j] 
    j+=1 
+0

謝謝。我意識到另一個很愚蠢的錯誤。我試圖追加到一個字符串。 :) – Chocolava

2

因爲在第二個while循環中,你正在增加j而不檢查你是否在最後。

此外,s[j]!=''將始終適用於字符串。如果您可以在字符串上使用索引運算符,則表示有字符。否則沒有。

例如:

s = '' 
s[0] # IndexError, there are no characters so there can be no index 

s = 'x' 
s[0] # Will be x and s[1] will give the same error as above 

代碼的一點點簡單的版本(不是真的Python的,會更好用列表和使用' '.join()):

s = 'abcdef ghij klmn op qrst uv w xy z' 
print s 

p = '' 
i = 0 
word = '' 
while i < len(s): 
    c = s[i] 
    if c == ' ': 
     if p: 
      p = word + ' ' + p 
     else: 
      p = word 

     word = '' 
    else: 
     word += c 
    i += 1 

print p 

和清潔/簡單Pythonic版本與拆分:

s = 'abcdef ghij klmn op qrst uv w xy z' 
print s 
p = ' '.join(s.split()[::-1]) 
print p 
+0

謝謝。它完美的作品。 – Chocolava

0
while(s[j]!=''): 
     a=a+s[j] 
     j+=1 

這裏是問題。您的最後一個字符是z。當它到達那裏,你當條件爲真。而它試圖增量j下一個索引..這是越界..

你也許可以將這個條件也移動到你的outer while循環中。因爲你需要同時檢查兩個條件......這兩個條件在你的情況下必須是真的..

1

我想你想這樣做: -

s='abcdef ghij klmn op qrst uv w xy z' 
s=s[::-1] 
print s 
j=0 
p=[] 
while(j<len(s)): 
    a='' 
    while(j<len(s) and s[j]!=' '): 
     a=a+s[j] 
     j+=1 
    p.append(a[::-1]) 
    j+=1 
print ' '.join(p) 
+0

沒問題。只是,我不知道連接功能。謝謝。 – Chocolava

相關問題