我目前正在阅读关于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
答案 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
前缀。