web-dev-qa-db-fra.com

TypeError: les index de chaîne doivent être des entiers, pas str // travaillant avec dict

J'essaie de définir une procédure, involved(courses, person), qui prend en entrée une structure de cours et une personne et renvoie un dictionnaire décrivant tous les cours auxquels la personne participe.

Voici ma fonction involved(courses, person):

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

Voici mon dictionnaire:

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

Quand j'essaye de tester mon code:

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

Python me donne une erreur:

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

Comment puis-je résoudre ce problème?

Merci.

37
Michael

time1 est la clé du dictionnaire le plus externe, par exemple, feb2012. Vous essayez donc d'indexer la chaîne, mais vous ne pouvez le faire qu'avec des entiers. Je pense que ce que tu voulais était:

for info in courses[time1][course]:

En parcourant chaque dictionnaire, vous devez ajouter un autre nid.

33
TerryA

En fait, je pense qu'une approche plus générale de la lecture en boucle du dictionnaire consiste à utiliser 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

sortie:

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

Ou, comme Matthias l'a mentionné dans les commentaires, si vous n'avez pas besoin de clés, vous pouvez simplement utiliser itervalues ​​() :

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