Python的二维列表

时间:2014-05-11 03:18:37

标签: 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(输入("输入学生人数:")) ROWS = int(输入("输入每个学生的成绩数:")

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 :(得分: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

答案 1 :(得分: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))

答案 2 :(得分: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

答案 3 :(得分: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(...))获取输入以从字符串中删除引号。然后我们使用列表推导来获取每个列表的平均值,然后使用列表推导使列表列表中的所有列表成为一个列表(对所有列表 :)抱歉)。然后我们将其退回,最后打印出来。

不要犹豫,不要在下面提出任何问题!

希望这有帮助。