2016-05-27 3 views
-1

У меня есть три функции: одна для вычисления среднего уровня, одна для взвешенных оценок и одна для среднего по программе. Эти функции вычисляют баллы конкретного учащегося, который выбирает пользователь. (Для отл. Рассчитает лаборатории Средн. Только Ablao не других студентов)Вычисление совокупных средних значений (Как это сделать?)

Ablao 3 74 96 72 88 71 80 83 77 90 88 95 71 76 94 80 74 98 77 
Anderson 3 76 92 98 95 92 76 93 97 85 76 85 93 82 88 75 84 92 77 
Aspinwall 1 86 74 78 97 86 94 73 95 74 91 75 94 83 99 83 78 88 96 
Bacon 4 72 95 81 80 89 88 100 87 87 81 79 77 75 83 87 96 72 95 

Существует информация для 60 студентов в файле. Первое число после имени означает класс ученика. 1 = Freshman 2 = Sophomore и т. Д.

Мне нужно создать новую функцию, которая будет использовать мои существующие функции для вычисления средних значений ВСЕХ учащихся в совокупности, а также учащихся для каждого класса, а затем средних средних значений, и мин.

Код, который я написал до сих пор, для этой функции не работает, и я не знаю, как начать приближаться к проблеме.

with open(FileName, 'r') as f: 
    line = f.readlines() 

student_status=(float(line.split()[1])) 

def make_lists_of_status(): 
    if (student_status==1): 
     Freshman.append(student_scores) 
    elif (student_status==2): 
     Sophomores.append(student_scores) 
    elif (student_status==3): 
     Juniors.append(student_scores) 
    elif (student_status==4): 
     Seniors.append(student_scores) 

Ожидаемый результат должен быть как

This option is for viewing statistics sorted by the year of student. 
    Please select one of the following options: 
    a for ALL YEARS 
    b for FRESHMAN 
    c for SOPHMORES 
    d for JUNIORS 
    e for SENIORS 

Enter your choice here: e 

For Seniors: 
High/Low/Mean of all Weighted Scores: 89.53999999999999/ 81.60000000000001/86.15736842105264 
High/Low/Mean of all Lab Averages: 89.6/80.2/86.21052631578948 
High/Low/Mean of all Program Averages: 94.33333333333333/77.0/86.78947368421052 
+0

Не могли бы вы показать нам свой код для трех других функций? Вы хотите сказать, что хотите рассчитать среднее значение всех результатов студента? –

+0

@MoonCheezes функции работают для одного студента за раз, что они должны, но мне нужна новая функция, которая будет вычислять для всех студентов и сортировать оценки по классам – Rachel

ответ

0

Это может быть сделано с помощью словаря.

students = {} 

with open("inCSV.txt", "r") as f: 
    for line in f.readlines(): 
     data = line.rstrip().split(" ") 

     student_name = data[0] 
     student_grade = data[1] 
     student_data = [int(x) for x in data[2:]] 
     student_avg = sum(student_data[2:])/float(len(student_data[2:])) 

     # Set the students name to a tuple of student's grade and average 
     students[student_name] = (student_grade, student_avg) 

# Sort the students by their averages. (Descending order) 
# Add reverse=True to have it in ascending order 
print sorted(students.keys(), key=lambda x: students[x][1]) 

EDIT

Он все еще может быть сделано аналогичным образом.

students = {} 

def weighted_scores(x): 
    return x 

with open("inCSV.txt", "r") as f: 
    for line in f.readlines(): 
     data = line.rstrip().split(" ") 

     student_name = data[0] 
     student_grade = data[1] 
     student_data = [int(x) for x in data[2:]] 

     student_program_avg = sum(student_data[2:])/float(len(student_data[2:])) 
     # Edit this part to your code 
     student_weighted_scores = weighted_scores(data[2:]) 
     student_lab_averages = lab_average(data[2:]) 

     students[student_name] = (student_grade, 
            student_weighted_scores, 
            student_lab_averages, 
            student_program_avg) 
print students 

def get_level(x): 
    ret_dict = {} 
    for k, v in students: 
     if v[0] == x: 
      ret_dict[k] = v 


def choose(x): 
    people = get_level(x) 
    overall = [] 

    for s in range(1, 4): 
     # Get grades of either weighted scores, lab averages or just average. 
     # Sort grades in descending order 
     grades = sorted(people.keys(), key=lambda x: people[x][s]) 

     highest = grades[0] 
     lowest = grades[-1] 
     mean = sum(grades[2:])/float(len(grades[2:]) 

     overall.append((highest, lowest, mean)) 

    # overall[0] => weighted scores 
    # overall[1] => lab averages 
    # overall[2] => program average 
    # overall[x][0] => highest of x 
    # overall[x][1] => lowest of x 
    # overall[x][2] => mean of x 

    print "For %i level:" % (x) 
    print "High/Low/Mean of Weighted Scores: %i/%i/%i" % (overall[0][0], overall[0][1], overall[0][2]) 
    print "High/Low/Mean of Lab Averages: %i/%i/%i" % (overall[1][0], overall[1][1], overall[1][2]) 
    print "High/Low/Mean of Weighted Scores: %i/%i/%i" % (overall[2][0], overall[2][1], overall[2][2]) 

# Let's say you picked seniors: 
choose(4) 
+0

Ive изменял этот код, но он не работает для меня , Какие комментарии у вас есть в general.append? @MoonCheesez – Rachel

+0

Эти комментарии просто описывают вам, как индексировать общий список. 'x' - это либо взвешенные баллы, либо средние значения в лаборатории, либо среднее значение программы. –

+0

Итак, где же 0, я заменяю это на 0 для самого высокого, -1 для самого низкого? @MoonCheesez – Rachel

0

Я думаю, что это делает то, что вы хотите:

scores_student = {} 
scores_grade = [[],[],[],[]] 
scores_all  = [] 
with open("students.txt", "r") as f: 
    for line in f: 
     # Parse the line 
     toks = line.split() 
     name = toks[0] 
     grade = int(toks[1]) 
     scores = [float(tok) for tok in toks[2:]] 
     # Save scores both per student, in that student's grade, and total 
     scores_student[(name,grade)] = scores 
     scores_grade[grade-1] += scores 
     scores_all += scores 

# Print individual student info 
print "Students" 
for name,grade in sorted(scores_student): 
    score = scores_student[(name,grade)] 
    print "%-10s %d mean %4.1f max %3d min %3d" % (name, grade, sum(score)/len(score), max(score), min(score)) 
print 
print "Summary" 
for grade, score in enumerate(scores_grade): 
    if len(score) > 0: 
     print "grade %d mean %4.1f max %3d min %3d" % (grade+1, sum(score)/len(score), max(score), min(score)) 
print "all  mean %4.1f max %3d min %3d" % (sum(scores_all)/len(scores_all), max(scores_all), min(scores_all)) 
+0

Я отредактирую свой вопрос, чтобы включить ожидаемый результат @amaurea – Rachel

Смежные вопросы