0

この質問の問題は、コード アカデミーからのものです。コードを機能させるためにプログラムで不正行為をしていると思うので、完全には満足していませんが、解決策を考え出しました。これを解決する他の方法はありますか。よりハードなコードを見てきました。これはかなり簡単です。

4 つのキーを持つ学生に関する 3 つの辞書。キーのうち 3 つはリストです。平均を計算する関数 文字成績を計算する関数 各子供の​​平均を計算する関数

さて、すべての関数と同様に、各キッド関数で平均を呼び出して平均を計算します。

ただし、新しいリストを作成して 3 人の生徒全員を含める場合 --- これにより、3 つのリスト アイテムを持つ生徒リストが作成されます。各項目には、4 つのキーを持つ辞書があります。4 つのキーのうち 3 つがリストです。ふぅ!!!

getClassAverage 関数でカウンターとインクリメントを使用して for ループを使用し、平均を計算しました。

質問:

  • forループなしで平均を計算する別の方法はありますか。つまり、関数内で渡された引数「who」を使用するだけでは、学生(データ)があり、リストでうまく参照されません。整数ではなく文字列でインデックスを付けます」エラー?

  • キー内にリストがあり、リスト内にあります。getClassAverage 関数から学生の名前を出力するにはどうすればよいですか?

ありがとう!

Lloyd = {
    "name":"Lloyd",
    "homework": [90,97,75,92],
    "quizzes": [ 88,40,94],
    "tests": [ 75,90]
    }
Alice = {
    "name":"Alice",
    "homework": [100,92,98,100],
    "quizzes": [82,83,91],
    "tests": [89,97]
    }
Tyler = {
    "name":"Tyler",
    "homework": [0,87,75,22],
    "quizzes": [0,75,78],
    "tests": [100,100]
    }

def average(stuff):
    return sum(stuff)/len(stuff)

def getLetterGrade(score):
    score = round(score)
    if  score >= 90: return "A"
    elif  90 > score >= 80: return "B"
    elif  80 > score >= 70: return "C"
    elif  70 > score >= 60: return "D"
    elif  60 > score: return "F"

def getAverage(kid):
    bar = average
    return bar(kid["homework"])*.1 + bar(kid["quizzes"])*.3 + bar(kid["tests"])*.6

students = [Lloyd,Alice,Tyler]

def getClassAverage(who):
    class_ave = 0
    class_avetot = 0
    count = 0
    for x in who:
        class_avetot = class_avetot + getAverage(who[count])
        #print who[count]
        stu_score = getAverage(who[count])
        print stu_score
        print getLetterGrade(stu_score)
        count = count + 1
    class_ave = class_avetot / len(who)
    return class_ave

print str(getClassAverage(students))
4

2 に答える 2

0

平均を推定するために、numpyには使用できる関数があります。

from numpy import average

getClassAverage関数では、生徒の名前のリストを渡します。だからあなたがそうするなら:

for x in who:
        print x  # This prints the name of the student
        class_avetot = class_avetot + getAverage(who[count])

クラスの平均に追加する平均成績を見積もると、生徒の名前が印刷されます。

お役に立てば幸いです。

于 2012-12-22T02:26:02.427 に答える
0

既に持っているコードと関数を使用して、これを試してください。

def getClassAverage (who):
    return average ( [getAverage (kid) for kid in who] )

あなたのコードは問題ありません。これを実装する方法を投稿して、いくつかの別のポイントを提供します。私のバージョンが優れている、または優れているとは言いません。

#! /usr/bin/python3.2

def ave (x): return sum (x) / len (x)

def getLetterGrade (score):
    score = round (score)
    if score >= 90: return 'A'
    if score >= 80: return 'B'
    if score >= 70: return 'C'
    if score >= 60: return 'D'
    #Why no grade E?
    return 'F'

class Student:
    def __init__ (self, name, homework, quizzes, tests):
        self.name = name
        self.homework = homework
        self.quizzes = quizzes
        self.tests = tests

    @property
    def average (self):
        return ave (self.homework) * .1 + ave (self.quizzes) * .3 + ave (self.tests) * .6

    def printAverage (self):
        print ('{} has an average of {:.2f} ({})'.format (self.name, self.average, getLetterGrade (self.average) ) )

class Class:
    def __init__ (self, students):
        self.students = students

    @property
    def average (self):
        return ave ( [student.average for student in self.students] )

    def printStudents (self):
        for student in students:
            student.printAverage ()

    def printAverage (self):
        print ('The class has an average of {:.2f}'.format (self.average) )

students = [Student ('Lloyd', [90,97,75,92], [88,40,94], [75,90] ),
    Student ('Alice', [100,92,98,100], [82,83,91], [89,97] ),
    Student ('Tyler', [0,87,75,22], [0,75,78], [100,100] ) ]

myClass = Class (students)
myClass.printStudents ()
myClass.printAverage ()

(Inb4 PEP8、私はそれを知っています、私はそれを読みました、私はそれを無視することにしました。)

于 2012-12-25T21:34:37.490 に答える