Python中的二维列表
这个函数 avgavg()
接收一个列表作为输入,这个列表里的每个项目又是一个包含三个数字的列表。每个包含三个数字的列表代表一个学生在某门课上的三次成绩。比如,下面这个输入列表是针对四个学生的(你永远不知道你需要处理多少学生):
[[95, 92, 86], [66, 75, 54], [89, 72, 100], [34, 0, 0]]
这个函数 avgavg()
应该在屏幕上打印两行内容。第一行会显示每个学生的平均成绩列表。第二行只会显示一个数字:班级的平均成绩,这个成绩是所有学生平均成绩的平均值。
根据上面的数据,输出结果是:
[91.0, 65.0, 87.0, 11.333333333334]
63.5833333333
(这是我的作业问题。我尝试了几种不同的方法,但似乎无法将我的输入与任何东西连接起来。我该如何解决这个问题?这是我最新的尝试: COLS = int(input("请输入学生人数:")) ROWS = int(input("请输入每个学生的成绩数量:"))
def avgavg():
student_grades = []
for c in range(COLS):
student = input("Enter the number of the student: ")
grades = []
for r in range (ROWS):
grade = eval(input("Enter the grades for the student: "))
grades.append(grade)
student_grades[student] = grades
print(grades)
4 个回答
这里是可以运行的代码:
lists = eval(raw_input('Enter the class data as a list: '))
def avgavg(lists):
avg = [float(sum(sub))/float(len(sub)) for sub in lists]
everything = [item for sub in lists for item in sub]
allavg = float(sum(everything))/float(len(everything))
return avg, allavg
avg, allavg = avgavg(lists)
print avg
print allavg
运行结果是:
bash-3.2$ python lists.py
Enter the class data as a list: [[95, 92, 86], [66, 75, 54], [89, 72, 100], [34, 0, 0]]
[91.0, 65.0, 87.0, 11.333333333333334]
63.5833333333
bash-3.2$
这段代码通过 eval(raw_input(...))
来获取输入,这样可以去掉字符串中的引号。接着,我们使用列表推导式来计算每个列表的平均值,然后再用列表推导式把一个列表中的所有列表合并成一个列表(抱歉让你看到这么多的 列表 :))。最后,我们返回这个结果,并在最后把它打印出来。
如果有任何问题,欢迎在下面提问!
希望这对你有帮助。
我知道这是一个作业,在现实生活中我会毫不犹豫地使用numpy:
> grades = [[95, 92, 86], [66, 75, 54], [89, 72, 100], [34, 0, 0]]
> np.average(grades, axis=1)
array([ 91. , 65. , 87. , 11.33333333])
> np.average(grades)
63.583333333333336
这里是对sshashank124回答的进一步解释,并添加了用户输入的功能。我还加入了一些错误处理的代码(使用了while循环),这样如果用户输入的是字符串而不是成绩,程序会再次询问:
记住,不要直接使用这段代码来提交。这可能会违反你课堂上的诚信原则。尽量从头开始重写代码,并说明哪里做得不好。
你在代码中犯的错误是把两个for循环单独放在一起了。它们需要嵌套在一起。
error = "Non integer input. Try again>> " #Error message
def isfloat(value): #Functon to check if a number can be a grade
try:
float(value)
return True
except ValueError:
return False
n = raw_input("Enter number of students>> ") #Number of students
while not n.isdigit():
n = raw_input(error)
g = raw_input("\nEnter number of grades per student>> ") #Number of Grades per student
while not g.isdigit():
g = raw_input(error)
grades = [] #The two dimensional list
print
#Receiving input from the user
for a in range(int(n)):
temp = []
print "Student %i" % (a+1)
for b in range(int(g)):
grade = raw_input("Grade %i>> " % (b+1))
while not isfloat(grade):
grade = raw_input(error)
temp.append(float(grade))
grades.append(temp)
print
students = [sum(stud)/float(len(stud)) for stud in grades]
#Returning output
print students
print sum(students)/float(len(students))
要计算一个列表的平均值,比如说 [1, 2, 3]
,你可以这样做:
a = [1, 2, 3]
print sum(a)/float(len(a))
希望这些信息能帮助你入门。我会让你自己去理解具体的细节。另外,只有当你表现出足够的努力,尝试自己解决这个问题但没有成功时,我才会发布完整的解决方案。
现在你已经展示了一些努力:
可行的解决方案
a = [[95, 92, 86], [66, 75, 54], [89, 72, 100], [34, 0, 0]]
b = [sum(i)/float(len(i)) for i in a]
>>> print b
[91.0, 65.0, 87.0, 11.333333333333334]
print sum(b)/float(len(b))
63.5833333333