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

Mic*_*ael 38 python dictionary

我正在尝试定义一个过程,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
Run Code Online (Sandbox Code Playgroud)

这是我的字典:

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'},
                     }
    }
Run Code Online (Sandbox Code Playgroud)

当我试图测试我的代码时:

>>>print involved(courses, 'Dave')
Run Code Online (Sandbox Code Playgroud)

Python给我一个错误:

for info in time1[course]:
TypeError: string indices must be integers, not str
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

谢谢.

Ter*_*ryA 33

time1是最外部词典的关键,例如,feb2012.那么你试图索引字符串,但你只能用整数来做.我想你想要的是:

for info in courses[time1][course]:
Run Code Online (Sandbox Code Playgroud)

当您浏览每个字典时,必须添加另一个字符串.


Rom*_*kar 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
Run Code Online (Sandbox Code Playgroud)

输出:

assistant Peter C.
prereq cs101
...
name Programming a Robotic Car
teacher Sebastian
Run Code Online (Sandbox Code Playgroud)

或者,正如马蒂亚斯在评论中提到的,如果你不需要键,你可以使用itervalues():

for term_courses in courses.itervalues():
    for info in term_courses.itervalues():
        for k, v in info.iteritems():
            print k, v
Run Code Online (Sandbox Code Playgroud)