1

このプロジェクトでは、次のようなネストされた辞書を使用しています。

line4 = {'fmlast14': {'quiz1': 100, 'quiz2': 100,
                      'lab1': 100, 'lab2': 100, 'lab3': 100, 'lab4': 100, 'lab5': 75,
                      'exam0': 92}}

次のステップで、彼は「クイズ、ラボ、および試験の平均スコアを計算します。ラベルの共通のプレフィックスを使用して、個々のクイズ、ラボ、および試験のスコアを見つけます。たとえば、ラボの平均スコアを計算するには、 'fmlast12'、プレフィックス 'lab' を持つ 5 つのラベルに関連付けられたスコアを合計し、5 で割ります。"

彼の言っていることは理解できますが、前に「quiz(x)」または「lab(x)」しかない要素を追加する方法がわかりません。

この部分の前に、最初の行を読み取り、そのラベルをリストに格納することになっていました (score.txt というテキスト ファイルを読み取っています)。次に、後続の各行を読み取り、ネストされた辞書を使用してその内容を格納することになっていました。私がこれまでに得たもの:

def read_scores(filename):
#with open(filename, 'r') as f:
    #first_line = f.readline()

    f = open(filename)
    lines = f.readlines()
    lines[1:]
    with open(filename, 'r') as f:
        second_line = f.readline()
        second_line[2:]
    line2 = { 'fmlast12' : {'quiz1' : 66, 'quiz2' : 100, 'lab1' : 100, 'lab2' : 100, 'lab3' : 75, 'lab4' : 75, 'lab5' : 75, 'exam0' : 86}}
    line3 = { 'fmlast13' : {'quiz1' : 100, 'quiz2' : 0, 'lab1' : 100, 'lab2' : 100, 'lab3' : 0, 'lab4' : 50, 'lab5' : 75, 'exam0' : 68}}
    line4 = { 'fmlast14' : {'quiz1' : 100, 'quiz2' : 100, 'lab1' : 100, 'lab2' : 100, 'lab3' : 100, 'lab4' : 100, 'lab5' : 75, 'exam0' : 92}}

def write_report(filename):
    line2 = { 'fmlast12' : {'quiz1' : 66, 'quiz2' : 100, 'lab1' : 100, 'lab2' : 100, 'lab3' : 75, 'lab4' : 75, 'lab5' : 75, 'exam0' : 86}}
    sum(line2.values())


    c = defaultdict(int)
    for d in line2:
        c[d['quiz1']] += d['amt']
4

3 に答える 3

1

これが辞書の標準形式である場合は、次のようなものを試すことができます

# for lab
In [5]: l = [line4['fmlast14'][x] for x in line4['fmlast14'].keys() if x.startswith('lab')]

In [6]: sum(l)/len(l)
Out[6]: 95

# for quiz

In [7]: l2 = [line4['fmlast14'][x] for x in line4['fmlast14'].keys() if x.startswith('quiz')]

In [8]: l2
Out[8]: [100, 100]

In [9]: avg = sum(l2)/len(l2)

In [10]: avg
Out[10]: 100

あなたもそれをすることができます

In [22]: [v for k, v in line4['fmlast14'].items() if k.find('quiz') > -1]
Out[22]: [100, 100]

In [23]: [v for k, v in line4['fmlast14'].items() if k.find('lab') > -1]
Out[23]: [100, 100, 100, 100, 75]
于 2013-03-08T04:42:18.863 に答える
0

関数を使用して最適化することもできます。

def getAvg(dVals, keyVal, nameStart):
    vals = [val for key, val in dVals[keyVal].iteritems() if key.startswith(nameStart)]
    return float(sum(vals) / len(vals))

for line in [line2, line3, line4]:
    person = line.keys().pop()
    print "Avg lab for {0} is {1}.".format(person, getAvg(line2, person , 'lab'))
    print "Avg quiz for {0} is {1}.".format(person, getAvg(line2, person , 'quiz'))
于 2013-03-08T04:49:44.997 に答える
0

平均を計算する関数を書くのはおそらく良い考えです

>>> line2 = { 'fmlast12' : {'quiz1' : 66, 'quiz2' : 100, 'lab1' : 100, 'lab2' : 100, 'lab3' : 75, 'lab4' : 75, 'lab5' : 75, 'exam0' : 86}}
>>> def get_average(d, prefix):
...     scores = [v for k, v in d.items() if k.startswith(prefix)]
...     return float(sum(scores))/len(scores)
... 
>>> get_average(line2['fmlast12'], 'quiz')
83.0
>>> get_average(line2['fmlast12'], 'lab')
85.0

ここで、スコアを読み取るための関数を整理する必要があります。現時点ではあまり意味がありません

于 2013-03-08T04:55:29.263 に答える