需要在python中添加字典的某些部分

2024-10-02 22:27:47 发布

您现在位置:Python中文网/ 问答频道 /正文

在我们的项目中,我们使用了一个嵌套字典,比如:

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

下一步,他让我们“计算平均测验、实验室和考试成绩。使用标签的通用前缀查找单个测验、实验室和考试分数。例如,要计算'fmlast12'的平均实验室分数,请将与前缀为'lab'的五个标签相关联的分数相加,然后除以5。“

我明白他在说什么,但我不明白我该怎么添加那些只有“测验(x)”或“实验室(x)”前面的元素。你知道吗

在本部分之前,我们应该读取第一行并将其标签存储在一个列表中(我们正在读取一个名为分数.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']

Tags: 标签openfilename实验室分数lab3line2lab1
3条回答

您还可以使用函数优化:

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'))

如果这是词典的标准格式,您可以尝试以下操作

# 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]

写一个函数来计算平均值可能是个好主意

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

现在你需要整理你的函数来读取分数。现在说不通

相关问题 更多 >