TypeError: los índices de cadena deben ser enteros, no str // trabajando con dict

Estoy tratando de definir un procedimiento, involved(courses, person) , que toma como entrada una estructura de cursos y una persona y devuelve un Diccionario que describe todos los cursos en los que está involucrada la persona.

Aquí está mi función involved(courses, person) :

 def involved(courses, person): for time1 in courses: for course in courses[time1]: for info in time1[course]: print info 

Aquí está mi diccionario:

 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'}, } } 

Cuando estoy tratando de probar mi código:

 >>>print involved(courses, 'Dave') 

Python me da un error:

 for info in time1[course]: TypeError: string indices must be integers, not str 

¿Cómo puedo arreglar eso?

Gracias.

time1 es la clave del diccionario más externo, por ejemplo, feb2012 . Entonces, estás tratando de indexar la cadena, pero solo puedes hacer esto con números enteros. Creo que lo que querías era:

 for info in courses[time1][course]: 

A medida que revisa cada diccionario, debe agregar otro nido.

En realidad, creo que un enfoque más general para recorrer el diccionario es usar 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 

salida:

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

O, como Matthias mencionó en los comentarios, si no necesita claves, puede usar itervalues ​​() :

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

Veo que está buscando una implementación del problema más que la solución de ese error. Aquí tienes una posible solución:

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

Lo primero que hago es obtener la lista de los cursos y luego filtrar por nombre del profesor.