Python中的二维列表

0 投票
4 回答
2909 浏览
提问于 2025-04-18 06:10

这个函数 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 个回答

0

这里是可以运行的代码:

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(...)) 来获取输入,这样可以去掉字符串中的引号。接着,我们使用列表推导式来计算每个列表的平均值,然后再用列表推导式把一个列表中的所有列表合并成一个列表(抱歉让你看到这么多的 列表 :))。最后,我们返回这个结果,并在最后把它打印出来。

如果有任何问题,欢迎在下面提问!

希望这对你有帮助。

0

我知道这是一个作业,在现实生活中我会毫不犹豫地使用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
1

这里是对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

要计算一个列表的平均值,比如说 [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

撰写回答