如何在python中使用子列表执行计算

时间:2018-10-06 23:21:28

标签: python

我正在尝试从主列表的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)

4 个答案:

答案 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生成器的输出)的第一种选择似乎要好得多:)