好的,所以在我们的项目中,我们使用的是嵌套字典,例如:
line4 = {'fmlast14': {'quiz1': 100, 'quiz2': 100,
'lab1': 100, 'lab2': 100, 'lab3': 100, 'lab4': 100, 'lab5': 75,
'exam0': 92}}
在下一步中,他要求我们“计算平均测验,实验室和考试成绩。使用标签的公共前缀来查找单个测验,实验和考试成绩。例如,计算平均值'fmlast12'的实验室得分,将与前缀'lab'然后除以5的五个标签相关的分数相加。“
我得到他所说的,但我不明白我应该如何添加只有“quiz(x)”或“lab(x)”之前的元素。
在此部分之前,我们应该读取第一行并将其标签存储在一个列表中(我们正在读取一个名为scores.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']
答案 0 :(得分: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]
答案 1 :(得分: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'))
答案 2 :(得分: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
现在你需要整理你的阅读乐谱的功能。目前它没有多大意义