无法从Udacity CS101中找出python代码中的keyerror

时间:2014-04-29 15:00:49

标签: python

我目前正在阅读关于Udacity的cs101课程,我收到了错误

Keyerror 'a'

我不知道它来自哪里。我知道如果您正在搜索不存在的密钥,您可能会收到关键错误。

这段代码应该通过课程词典进行搜索,并打印出一个人参与的学期和课程,无论他们是教师还是助手。此外,并不总是有助手。

如果有人在sprg15中教cs101,它会是这样的 {"sprg1d":["cs101"]}

courses = {
    'feb2012': { 'cs101': {'name': 'Building a Search Engine',
                           'teacher': 'Dave',
                           'assistant': 'Peter C.'},
                 'cs373': {'name': 'Programming a Robotic Car',
                           'teacher': 'Sebastian',
                           'assistant': 'Andy'}},
    'apr2012': { 'cs101': {'name': 'Building a Search Engine',
                           'teacher': 'Dave',
                           'assistant': 'Sarah'},
                 'cs212': {'name': 'The Design of Computer Programs',
                           'teacher': 'Peter N.',
                           'assistant': 'Andy',
                           'prereq': 'cs101'},
                 'cs253': 
                {'name': 'Web Application Engineering - Building a Blog',
                           'teacher': 'Steve',
                           'prereq': 'cs101'},
                 'cs262': 
                {'name': 'Programming Languages - Building a Web Browser',
                           'teacher': 'Wes',
                           'assistant': 'Peter C.',
                           'prereq': 'cs101'},
                 'cs373': {'name': 'Programming a Robotic Car',
                           'teacher': 'Sebastian'},
                 'cs387': {'name': 'Applied Cryptography',
                           'teacher': 'Dave'}},
    'jan2044': { 'cs001': {'name': 'Building a Quantum Holodeck',
                           'teacher': 'Dorina'},
               'cs003': {'name': 'Programming a Robotic Robotics Teacher',
                           'teacher': 'Jasper'},
                     }
    }

def involved(courses, person):
    inv={}
    for term in courses:
        for c in term:
            for i in courses[term][c]:                
                if courses[term][c][i]==person:
                    if term in inv:
                        inv[term].append(c)
                    else:
                        inv[term]=[c]
    return inv

1 个答案:

答案 0 :(得分:2)

您的for term in courses循环产生;这些是字符串。因此term首先分配了['apr2012', 'jan2044', 'feb2012']中的一个键。

下一个循环遍历term中的字符,然后:

for term in courses:
    for c in term:

如果term设置为apr2012,则c首先设置为a。但是没有courses['apr2012']['a']条目。

您可能希望循环关联的值:

for term in courses:
    for c in courses[term]:

您可以使用嵌套在字典理解中的列表推导来构建结果:

def involved(courses, person):
    return {t: [cn for cn, v in c.iteritems() if person in v.itervalues()]
            for t, c in courses.iteritems()}

虽然这可以返回空列表。如果这是一个问题,请将代码简化为:

def involved(courses, person):
    inv = {}
    for term, course in courses.iteritems():
        for course_name, info in course.iteritems():
            if person in info.itervalues():
                inv.setdefault(term, []).append(course_name)
    return inv

对于Python 3,删除所有iter前缀。