意外错误'列表索引超出范围'

时间:2017-02-23 01:48:20

标签: python

"""
calcGPA
@author: nick young
"""
# GPA Calculator.  Weights letter grade and credit hours and divides to return final GPA value

def calcGPA():
    error=('Improper Input, asshole. GPA is -1.')   #Snarky error message
    i=0 #tally numbers to count from
    a=0
    x=0
    y=0
    list1=list(input("Enter your letter grades earned on an A-F scale:"))
    list2=list(input('Enter the credit hours earned for each course in the same order as your first input \nNo spaces:'))
    list3=[] #empty list to append weighted values to

    if len(list1)!=len(list2) or len(list1)+len(list2)<=0:        #verifies lists are same length and not empty
        print(error)
    elif list1[i].upper() not in ['A','B','C','D','F']:        
        print(error)
        i=i+1
    elif list2[a].isdigit()==False:                              
        a=a+1
        print(error)

    for letter in list1:         #loop determines letter grade and returns numeric value per element in list1
        if letter.upper=='A':    #runs through until each element in list1 has been converted into a numeric value to be weighted
            list3.append(4*list2[x])
            x=x+1
        elif letter.upper=='B':
            list3.append(3*list2[x])
            x=x+1
        elif letter.upper=='C':
            list3.append(2*list2[x])
            x=x+1    
        elif letter.upper=='D':
            list3.append(1*list2[x])
            x=x+1
        elif letter.upper=='F':
            list3.append(0)
            x=x+1

        y=0
    while y<=len(list1):    #loop gathers the collective weight of each class to be divided

        weight=float(0)      
        weight=float(list3[y]*list2[y])
        y=y+1

    gpa=float(weight/sum(list2))    
    print(gpa)    

calcGPA()

对于这个GPA计算器,我需要遍历并乘以两个列表中的匹配元素(list2 [0] * list3 [0] ...),以获得输入的长度。代码已经检查以验证所有内容的长度是否相同。运行时,会出现错误'list index out of range'。

经过一些谷歌搜索,我听说这是因为变量超出了它应该的范围,但是从我看到的'y'不应超出list1的长度(这也是列表2的长度和三)。我试过只使用'&lt;'在while语句中也是如此。

旁注:我知道这个程序可能没有完美格式化,但我只是在课堂的第7周。

另一方面说明:我正在使用Spyder 3 IDE作为我的编译器

2 个答案:

答案 0 :(得分:1)

最初的问题是您使用了上部 属性而不是上部 方法。你需要这个:

for letter in list1:
    if letter.upper()=='A':
        list3.append(4*list2[x])

然后你会遇到list2是一个字符列表而不是整数的问题。试试这个:

        list3.append(4*int(list2[x]))

那些应该让你超过下一个驼峰。

答案 1 :(得分:1)

while y<len(list1):

而不是

while y<=len(list1):

索引在大多数语言中都是从零开始的,因此这是您通常想要做的事情。