Python TypeError:字符串索引必须是整数,而不是str//使用dict

Python TypeError:字符串索引必须是整数,而不是str//使用dict,python,dictionary,Python,Dictionary,我试图定义一个过程,included(courses,person),它将一个课程结构和一个人作为输入,并返回一个描述该人参与的所有课程的字典 以下是我参与的功能(课程、人员)功能: def involved(courses, person): for time1 in courses: for course in courses[time1]: for info in time1[course]: print in

我试图定义一个过程,
included(courses,person)
,它将一个课程结构和一个人作为输入,并返回一个描述该人参与的所有课程的字典

以下是我参与的
功能(课程、人员)
功能:

def involved(courses, person):
    for time1 in courses:
        for course in courses[time1]:
            for info in time1[course]:
                print info
这是我的字典:

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'},
                     }
    }
当我尝试测试代码时:

>>>print involved(courses, 'Dave')
Python给我一个错误:

for info in time1[course]:
TypeError: string indices must be integers, not str
我怎样才能解决这个问题


谢谢。

time1
是最外层字典的关键,例如2012年2月的
。因此,您试图为字符串编制索引,但只能使用整数。我想你想要的是:

for info in courses[time1][course]:

在浏览每个字典时,必须添加另一个嵌套。

实际上,我认为循环浏览字典的更通用方法是使用:

输出:

assistant Peter C.
prereq cs101
...
name Programming a Robotic Car
teacher Sebastian
或者,正如Matthias在评论中提到的,如果您不需要钥匙,您可以使用:


我看到您正在寻找问题的实现,而不是解决该错误。这里有一个可能的解决方案:

from itertools import chain

def involved(courses, person):
    courses_info = chain.from_iterable(x.values() for x in courses.values())
    return filter(lambda x: x['teacher'] == person, courses_info)

print involved(courses, 'Dave')

我要做的第一件事是获取课程列表,然后按教师姓名进行筛选。

当您不需要密钥时,可以使用。是的,谢谢您的补充,我不知道OP是否想要使用密钥,但我应该注意到,实际上可以不使用chain-
[I for x in courses.values()for I in x.values()if I[“teacher”]==人]
for term_courses in courses.itervalues():
    for info in term_courses.itervalues():
        for k, v in info.iteritems():
            print k, v
from itertools import chain

def involved(courses, person):
    courses_info = chain.from_iterable(x.values() for x in courses.values())
    return filter(lambda x: x['teacher'] == person, courses_info)

print involved(courses, 'Dave')