2015-04-03 146 views
0

我試圖創建一個循環,將採取用戶輸入的內容並在大寫和小寫之間交替地打印回來。例如:用戶輸入'helloworld',它會打印出'HeLlOwOrLd'。這裏是我到目前爲止(相信我,我知道這是不是最佳的,這正是我能去上班):Python for循環:索引超出範圍錯誤

s = input("enter characters: ") 
word = '' 
count = 0 


for i in s: 
     up = s[::2] 
     up2 = up.upper() 
     up3 = up2[0 + count] 
     low = s[1::2] 
     low2 = low.lower() 
     low3 = low2[0 + count] 
     word += up3 + low3 
     count += 1 

print(word) 

當我跟蹤它在調試器,文字來正確的值,然後它再次運行該循環,從而導致索引超出範圍錯誤。想法?

+3

兩人在節目最常見的問題是緩存驗證,事物命名,並關閉的情況的一個錯誤。 – TigerhawkT3 2015-04-03 00:25:55

回答

2

您循環了太多次。你在循環中分裂一半,但是爲每個字符在s中循環一次。

s = input("enter characters: ") 
word = '' 


for count in range(len(s[::2])): 
     up = s[::2] 
     up2 = up.upper() 
     up3 = up2[0 + count] 
     low = s[1::2] 
     low2 = low.lower() 
     if(len(low2)>count): 
      low3 = low2[0 + count] 
     else: 
      low3='' 
     word += up3 + low3 
     count += 1 

print(word) 

乾杯!

+0

爲什麼要在每次迭代時轉換整個字符串,爲什麼要執行「0 + count」以及爲什麼增加計數? – tdelaney 2015-04-03 00:52:51

+0

該問題需要獲得關於錯誤的幫助。試圖儘可能少地改變導致錯誤的助手。 – 2015-04-03 00:55:28

2

count將最終等於s的長度。但是,您使用count作爲短於s的字符串的索引,如up3

嘗試以下方法:

>>> result = '' 
>>> word = 'hello' 
>>> for i in range(len(word)): 
...  result += (word[i].lower() if i%2 else word[i].upper()) 
... 
>>> result 
'HeLlO' 

另外:

>>> word = 'HellOWorLD' 
>>> ''.join(word[i].lower() if i%2 else word[i].upper() for i in range(len(word))) 
'HeLlOwOrLd' 
0

你可以使用的情況下的轉換函數從stringitertools.cycle改變哪一個被施加到每個字符。總結,所有起來連接語句,你會得到:

''.join(case(c) for case,c in 
    zip(itertools.cycle((string.upper,string.lower)), 'helloworld'))