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.