2015-04-03 148 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'))