函数avgavg()将一个列表作为输入,该列表的项目是三个数字的列表。每个三位数列表代表特定学生为课程收到的三个等级。例如,这是一个四个学生班级的输入列表:
[[95,92,86], [66,75,54],[89, 72,100],[34,0,0]]
avgavg()函数应在屏幕上打印两行。第一行将包含一个包含每个学生平均成绩的列表。第二行只包含一个数字:平均班级,定义为所有学生平均成绩的平均值。
avgavg([[95, 92, 86], [66, 75, 54],[89, 72, 100], [34, 0, 0]])
[91.0, 65.0, 87.0, 11.333333333333334]
63.5833333333
下面是我的代码,如果用户输入4个列表,它的工作完全正常,但如果列表小于或大于4则无效。你能帮我解决第二部分的循环。
def avg(lst):
i = 0
A = 0
C = 0
for row in lst :
for item in row:
B = (lst[i][A]+lst[i][A+1]+lst[i][A+2])/len(lst[i])
D = lst[i][A]+lst[i][A+1]+lst[i][A+2]
C = C+D
print (B,end=' ')
i = i +1
print ()
E = len(lst[A])+len(lst[A+1])+len(lst[A+2])+len(lst[A+3])
C = C/E
print (C)
return
Output
In [163]: lst = [[95, 92, 86], [66, 75, 54], [89, 72, 100],[34, 0, 0]]
In [164]: avg(lst)
91.0 65.0 87.0 11.333333333333334
63.58333333333333
我试图把E放在循环中,但是我会在改变值的情况下退出索引。
答案 0 :(得分:1)
您可以使用sum()
而不是使用循环,因为您知道每个列表的长度
student_grades = [[95,92,86], [66,75,54],[89, 72,100],[34,0,0]] #this is the list you pass into the function
all_avg = []
for i in student_grades:
all_avg.append(sum(i)/3.0)
print (sum(all_avg)/len(all_avg))
63.5833333333
虽然您的问题来自
,但要回答您的问题E = len(lst[A])+len(lst[A+1])+len(lst[A+2])+len(lst[A+3])
您仅将自己限制为4个列表。由于索引错误,你不能少于4,如果你有超过4,那么你将留下一个列表
答案 1 :(得分:1)
这个怎么样?
def avg(lst):
return sum(lst)/float(len(lst))
def avgavg(lst):
courses = [avg(l) for l in lst]
print(' '.join([str(c) for c in courses]))
print(avg(courses))
这会使用您在代码中未考虑的两件事:列表推导和sum()
内置函数。
答案 2 :(得分:1)
def avgavg(grade_list):
# Creates the list containing the average grade of all students.
# float() is important or you will only get integers (int / int -> int)
student_avgs = list(float(sum(grades)) / len(grades) for grades in grade_list)
# The global avg is the mean of student_avgs.
global_avg = sum(student_avgs) / len(student_avgs)
print(student_avgs)
print(global_avg)
avgavg([[95, 92, 86], [66, 75, 54], [89, 72, 100], [34, 0, 0]])
答案 3 :(得分:1)
你为什么要那么复杂?
如果我会写它,我可能会这样写:
classAverage = sum([sum(i)/len(i) for i in lst])/len(lst)
现在忘记pythonic方式和list comprehension
,该解决方案怎么样?
def avg(lst):
classSum=0
for row in lst :
sum=0
for item in row:
sum = sum + item
print sum/len(row),
classSum = classSum + sum
print
print classSum/len(lst)
非常基本的,当然不是最好的解决方案。有帮助吗?
答案 4 :(得分:1)
关于传递给avgavg的列表大小是通用的很重要,所以不应该使用像这样的硬编码索引。
lst[A+1]
见我的解决方案:
def avgavg(list_of_students):
averages = []
avg_class_grade = 0
for student_grades in list_of_students:
avg = sum(student_grades) / 3.0
averages.append(avg)
avg_class_grade += avg
avg_class_grade /= len(list_of_students)
print(averages)
print(avg_class_grade)
答案 5 :(得分:1)
你的设计有太多错误。不要太复杂:
from __future__ import division
def avg(list):
total_grade = 0
for student in list:
student_sum = 0
for grade in student:
student_sum += grade
print student_sum / 3
total_grade += student_sum / 3
print " "
print total_grade / len(list)
grades = [[95,92,86], [66,75,54],[89, 72,100],[34,0,0]]
avg(grades)
如果您需要任何解释,请在评论中告诉我。
答案 6 :(得分:1)
你的问题是你的E有4个元素,所以当然,它只适用于你有一个列表(lst
)并且有四个元素的情况。
我不明白你为什么每个循环然后有一个索引,你可以做一个正常的循环(for i in range(len(lst))
。在这里,我重新编写了代码,添加了try - 除了为了确保列表不为空。所以我的想法是迭代一种类型(因为我知道每个子列表都是len = 3)并在每次迭代时打印出平均值,同时将它添加到变量class_gr(类的总等级)。如果您需要一些额外的解释,请告诉我们。)
def avg(lst):
try:
lst[0]
class_gr = 0
for row in lst :
aver_gr = (row[0] + row[1] + row[2]) /3
class_gr += aver_gr
print(aver_gr,end = ' ')
print('\n'+ str(class_gr/len(lst)))
except IndexError:
print('List is empty!')
lst = [[1,2,3],[0,42,9]]
avg(lst)
输出:
2.0 17.0
9.5