类型错误:字符串索引必须是整数,而不是字符串 // 使用字典操作

44

我正在尝试定义一个过程involved(courses, person),它以课程结构和一个人作为输入,并返回描述这个人参与的所有课程的字典。

这是我的involved(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

我该怎么修复这个问题呢?

谢谢。


请帮忙:https://stackoverflow.com/questions/72428094/extracting-values-from-numpy-array - Martins Code
3个回答

37

time1 是最外层字典的键,例如 feb2012。因此,您正在尝试对字符串进行索引,但是只能使用整数进行操作。我认为您想要的是:

for info in courses[time1][course]:

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


8

实际上,我认为更通用的遍历字典的方法是使用iteritems()

# get tuples of term, courses
for term, term_courses in courses.iteritems():
    # get tuples of course number, info
    for course, info in term_courses.iteritems():
        # loop through info
        for k, v in info.iteritems():
            print k, v

输出:

assistant Peter C.
prereq cs101
...
name Programming a Robotic Car
teacher Sebastian

或者,正如Matthias在评论中提到的那样,如果您不需要键,则可以直接使用itervalues()

for term_courses in courses.itervalues():
    for info in term_courses.itervalues():
        for k, v in info.iteritems():
            print k, v

当您不需要键时,可以使用itervalues - Matthias
是的,感谢您的补充。我不知道 OP 是否想要使用键,但我应该注意到这一点。 - Roman Pekar

-1

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

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

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


1
实际上可以不使用链式操作 - [i for x in courses.values() for i in x.values() if i["teacher"] == person] - Roman Pekar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接