我正在尝试从主列表的4个子列表中获取4个平均值。我收到错误消息:TypeError:列表索引必须是整数或切片,而不是列表。有人可以在这种情况下解释我的意思吗?
studentgrades = [ [95, 92, 86],[66, 75, 54],[89, 72, 100],[34, 0, 0] ]
antw = []
for student in studentgrades:
average = sum(studentgrades[student]) / len(studentgrades[student])
antw.append(average)
print(antw)
答案 0 :(得分:1)
您在哪里出错的地方有点过头了,如果您删除了添加的其他元素,您的原始功能将可以正常工作。在您的循环中,students
已经代表了每个元素,因此无需再次以studentgrades[student]
的形式调用它
antw = []
for student in studentgrades:
average = sum(student) / len(student)
antw.append(average)
这可以通过 list comprehension 或附加到列表的单个循环
完成studentgrades = [ [95, 92, 86],[66, 75, 54],[89, 72, 100],[34, 0, 0] ]
l = [round(sum(i)/len(i), 2) for i in studentgrades]
# [91.0, 65.0, 87.0, 11.33]
展开
l = []
for i in studentgrades:
total = sum(i)
grades = len(i)
average = total/grades
l.append(round(average, 2))
另一个选择是map
,它使我们可以将函数应用于所有列表元素
l = list(map(lambda x: round(sum(x)/len(x), 2), studentgrades))
答案 1 :(得分:1)
因为学生是一个列表,而不是数字索引,所以应该使用
for i in range(len(studentGrid)):
antw.append(avg(studentGrid[i]))
答案 2 :(得分:0)
studentgrades[student]
没有意义,因为student
是分数列表。您可以只使用student
(更名为student_scores
之类的东西。)
答案 3 :(得分:0)
您的循环for student in studentgrades:
将在每次迭代中将student
设置为子列表之一。
因此对于第一次迭代,student
将成为子列表[95, 92, 86]
。
所以下一行,
average = sum(studentgrades[student]) / len(studentgrades[student])
当您尝试通过使用另一个列表(studentgrades
)来索引(访问)列表(student
)时,将引发该错误。
解决此问题的一种方法是遍历studentgrades
列表(在执行操作),然后在平均计算中使用那个列表:
for student in studentgrades:
average = sum(student) / len(student)
antw.append(average)
从视觉上讲,该代码将导致第一次迭代,如下所示:
for student in studentgrades:
average = sum([95, 92, 86]) / len([95, 92, 86])
antw.append(average)
如果您真的每次都希望索引studentgrades
,则可以将代码更改为:
for index in range(len(studentgrades)):
average = sum(studentgrades[index]) / len(studentgrades[index])
antw.append(average)
但是迭代子列表(而不是range
生成器的输出)的第一种选择似乎要好得多:)