python中的循环缩进

时间:2015-10-12 20:40:28

标签: python list loops indentation

函数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放在循环中,但是我会在改变值的情况下退出索引。

7 个答案:

答案 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