使用变量索引错误

时间:2014-09-29 00:35:45

标签: python indexing

#Dancing Text :D
listinput = raw_input("Input text(usually between 1-10 letters ")
dance_time = raw_input("Alternate How Many Times? ")
listinput = list(listinput)
length = len(listinput)
alternate = 0
counter = 0
first_input = listinput
swap_counter = 0
tempchar = ""
counter = int(counter) #Just to make sure...getting errors

#above are just defining variable types and changing types to lists.

while counter <= length:
    if alternate == 0: #first, third, fifth character
        alternate = alternate + 1
        counter = counter + 1
    elif alternate == 1: #second, fourth, sixth character and so on....
        tempchar = listinput[counter]
        tempchar = str(tempchar)
        tempchar = tempchar.swapcase()
        listinput[counter] = tempchar #It should be the number 1 the first time it runs, but it gives a index error.
        alternate = alternate - 1
        counter = counter + 1

while swap_counter <= dance_time:
    print first_input
    print input
    swap_counter = swap_counter + 2

这是错误 -

第20行,在模块

tempchar = listinput [counter]

IndexError:列表索引超出范围

我查找索引错误,'1'应该在列表范围内,(每当我测试它时,我输入'hello')

如果我理解正确,第20行,当它运行时应该是“listinput [1]”,变量'counter'为1,因为它只循环一次。

2 个答案:

答案 0 :(得分:0)

我认为你的问题是你假设列表的索引从1开始。实际上它们从0开始。所以如果列表中有一个项目[0]会给你那个项目。

所以,能够执行

tempchar = listinput[counter]

你必须确定

counter < length

是真的,这不是这里的情况,因为counter可以等于length。

答案 1 :(得分:0)

您的dance_time是一个字符串。请使用swap_counter <= int(dance_time):

如果事情可能有所帮助,可以选择一对夫妇:

你不需要一个模板。您可以转换代码:

    tempchar = listinput[counter]
    tempchar = str(tempchar)
    tempchar = tempchar.swapcase()
    listinput[counter] = tempchar 

到单线:

    listinput[counter] = str(listinput[counter]),swapcase()

请注意,您只是根据alternate的值交换交替字符的大小写。我猜这个虽然在这个例子中设置为0,但在真实的程序中,你会想要随意改变它。然后,您可以尝试以下方法:

for i, l in enumerate(listinput):
    if   alternate == 0:  
        if i%2 == 1: # odd samples
            listinput[i] = str(listinput[i]).swapcase()
    elif alternate == 1:  
        if i%2 == 0: # even samples
            listinput[i] = str(listinput[i]).swapcase()
    else:
        pass 

或者简单地说:

for i, l in enumerate(listinput):
    if (alternate+i)%2 == 1: # odd samples
        listinput[i] = str(listinput[i]).swapcase()

这是相同的,假设alterante01,之前可以使用if条件轻松检查。

最后,请注意Python中的函数是一等值。所以你也可以返回一个函数,并将其用作条件,如下所示:

def evenOdd(alternate):
    if   alternate == 0:  return lambda x: x%2 == 1
    elif alternate == 1:  return lambda x: x%2 == 0

print [  (l.swapcase() if evenOdd(alternate)(i) else l) for i, l in enumerate(listinput) ]

这有点容易阅读...

再次在这里,我保持简单。如果替代是除raiseValueError之外的任何内容,你可能希望在evenOdd函数中0 1

最后,按照上面的例子,你也可以这样做:

[(l.swapcase() if (i+alternate)%2==0 else l) for i, l in enumerate(listinput)]