Skip to main content
 首页 » 编程设计

python之为什么这给我错误字符串索引必须是整数

2025年05月04日20over140

lloyd = { 
"name": "Lloyd", 
"homework": [90, 97, 75, 92], 
"quizzes": [88, 40, 94], 
"tests": [75, 90] 
} 
alice = { 
    "name": "Alice", 
    "homework": [100, 92, 98, 100], 
    "quizzes": [82, 83, 91], 
    "tests": [89, 97] 
} 
tyler = { 
    "name": "Tyler", 
    "homework": [0, 87, 75, 22], 
    "quizzes": [0, 75, 78], 
    "tests": [100, 100] 
} 
def average(stuff): 
    return sum(stuff)/len(stuff) 
 
def getLetterGrade(score): 
    score = round(score) 
    if  score >= 90: return "A" 
    elif  90 > score >= 80: return "B" 
    elif  80 > score >= 70: return "C" 
    elif  70 > score >= 60: return "D" 
    elif  60 > score: return "F" 
 
def getAverage(kid): 
    bar = average 
    return bar(kid["homework"])*.1 + bar(kid["quizzes"])*.3 + bar(kid["tests"])*.6 
 
students = ["lloyd","alice","tyler"] 
 
#takes students list 
def getClassAverage(list, total = 0): 
    for x in list: 
        total += getAverage(x) 
    return total / len(list) 
 
#takes students list 
def classAvgFull(list): 
    print getClassAverage(list) 
    print getLetterGrade(getClassAverage(list)) 
 
classAvgFull(students) 

老实说,我就是想不通哪里出了问题。任何帮助将不胜感激。我敢肯定这只是一些简单的事情。非常非常开始我的学习,使用 codeacademy.com 在此先感谢您!

请您参考如下方法:

改变

students = ["lloyd", "alice", "tyler"] 

到

students = [lloyd, alice, tyler] 

了解如何自己调试此类问题很重要。

错误消息告诉您问题发生在这一行:

return bar(kid["homework"])*.1 + bar(kid["quizzes"])*.3 + bar(kid["tests"])*.6 

错误与索引有关:

string indices must be integers, not str 

一个自然而然的问题是,kid 的值(value)是什么?所以尝试在错误发生之前输入打印语句:

bar = average 
print(repr(kid)) 
return bar(kid["homework"])*.1 + bar(kid["quizzes"])*.3 + bar(kid["tests"])*.6 

你会发现它打印出来了

'lloyd' 

现在自然的问题变成了,kid 为什么是一个字符串, 'lloyd'?和我们真正想要什么?(答案:字典,lloyd)。如果您搜索调用 getAverage(kid) 的位置,您会发现自己在查看 getClassAverage 函数:

def getClassAverage(list, total = 0): 
    for x in list: 
        total += getAverage(x) 

现在自然的问题变成了,为什么 x 是字符串 'lloyd'? 和 中的值是什么list? 同样,您可以使用打印语句来查找答案。当然,我们在哪里调用 getClassAverage(list, ...)?

这样一直往回走,终于到了

students = ["lloyd", "alice", "tyler"] 

你会意识到它应该是

students = [lloyd, alice, tyler] 

永远不要将变量命名为 list。它隐藏了同名的内置函数。最好使用描述性名称,例如 students,因为这样您的变量名称有助于记录代码的含义。如果变量要表示通用序列,我建议使用 seq 或 iterable 之类的变量名。