python中的字典和文件

时间:2015-02-25 03:49:27

标签: python dictionary

嘿伙计们第一次问这里。

我正在试图弄清楚如何创建一个包含ID作为密钥的字典,并将值作为另一个字典,其中包含家庭作业论文和该个人ID考试的分数。

示例:

{"173-25-6389":
    {
        "hw":[94,89,92,73], 
        "quiz":[45,36,42,50,22,27,40,41], 
        "exam":[135,127]
    },
.....
}

这些数字是从代表类别的单独文件中提取的,并且每个文件都与相应的ID匹配。

我有4个文件可供使用,其中一个只包含我认为我将应用于较大词典中的键的ID。

我的主要问题是文件内部的每一行都写成:

  

173-25-6389 61

所以它是id加上space,然后是score。我不确定如何浏览该文件并搜索具有相同ID的其他分数。

我对如何查找分数列表感到有点困惑,然后将其添加到字典中作为包含ID的较大字典的值。任何关于如何先行的见解都会令人惊叹,如果你需要我详细说明,请告诉我。

我只编写了大约一年的时间,所以对我来说很容易。感谢

2 个答案:

答案 0 :(得分:3)

因此,我们假设您已经知道如何打开文件并逐行阅读。对于每一行,您都有一个id和一个分数,但您不知道结果dict中是否已存在分数。坦率地说,你不在乎。输入defaultdict。即使特定键不存在,它也可以保证您有用的值。

from collections import defaultdict
…
result = defaultdict(dict) # an undefined key will map an empty dict
for line in scorefile:
    id, score = line.split()
    result[id]['hw'] = score

但等等,这会用一个分数覆盖我们的'hw'键!我们想要一份清单!

让我们在这个默认情况下加倍。

# an undefined key will map a defaultdict
# whose undefined keys will map an empty list
result = defaultdict(lambda: defaultdict(list))
for line in scorefile:
    id, score = line.split()
    result[id]['hw'].append(score)

现在,你没有说我们如何从考试成绩中分辨出作业,所以我会把这一点留给你......

答案 1 :(得分:0)

我明白了。我打赌有一种更简洁的方式来写它甚至可能使用某种形式的递归,我只是没有足够的经验来解决它。但这就是我所得到的,它让我得到了我需要的东西。谢谢你的帮助!

def create_dictionary(idfilename,hwfilename,qzfilename,examfilename):
idread = open(idfilename, 'r')
hwread = open(hwfilename, 'r')
qzread = open(qzfilename, 'r')
examread = open(examfilename, 'r')
dict = {}
dicthw = {}
dictqz = {}
dictexam = {}

for line in idread:
    if line not in dict:
        dict[line.rstrip('\n')] = {}
for line in hwread:
    name, score = line.split()
    if name in dicthw:
        dicthw[name].append(score)
    else:
        dicthw[name] = [score]
for line in qzread:
    name, score = line.split()
    if name in dictqz:
        dictqz[name].append(score)
    else:
        dictqz[name] = [score]
for line in examread:
    name, score = line.split()
    if name in dictexam:
        dictexam[name].append(score)
    else:
        dictexam[name] = [score]
for k, v in dicthw.items():
    if len(v) < 4:
        while len(v) < 4:
            v.append(0)
    if k in dict:
        dict[k] = ({'hw':v})
for k, v in dictqz.items():
    if len(v) < 8:
        while len(v) < 8:
            v.append(0)
    if k in dict:
        qz_update = {'qz':v}
        dict[k].update(qz_update)
for k, v in dictexam.items():
    if len(v) < 2:
        while len(v) < 2:
            v.append(0)
    if k in dict:
        exam_update = {'exam':v}
        dict[k].update(exam_update)
return(dict)