2013-09-21 13 views
25

Ich versuche eine Prozedur zu definieren, involved(courses, person), die eine Struktur und eine Person als Eingabe nimmt und ein Dictionary zurückgibt, das alle Kurse beschreibt, die die Person ist beteiligt inTypeError: String-Indizes müssen Ganzzahlen sein, nicht str // Arbeiten mit dem Dict

Hier ist meine involved(courses, person) Funktion:.

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

Wenn ich:

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

Hier mein Wörterbuch ist versuche, meinen Code zu testen:

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

Python geben Sie mir eine Fehlermeldung:

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

Wie kann ich das Problem lösen?

Danke.

Antwort

29

time1 ist der Schlüssel des äußersten Wörterbuchs, z. B. feb2012. Also versuchen Sie, die Zeichenfolge zu indexieren, aber Sie können das nur mit Ganzzahlen machen. Ich denke, was Sie wollten, war:

Wie Sie durch jedes Wörterbuch gehen, müssen Sie ein weiteres Nest hinzufügen.

5

Eigentlich denke ich, dass allgemeineren Ansatz durch Wörterbuch Schleife iteritems() zu verwenden ist:

# 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 

Ausgang:

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

Oder, wie Matthias in den Kommentaren erwähnt, wenn Sie nicht brauchen, Schlüssel, können Sie einfach verwenden itervalues():

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

Wenn Sie den Schlüssel nicht benötigen, können Sie stattdessen [itervalues] (http://docs.python.org/2/library/stdtypes.html#dict.itervalues) verwenden. – Matthias

+0

Yep, danke für den Zusatz, ich weiß nicht, ob OP Schlüssel verwenden will, aber ich sollte bemerken, dass –

0

Ich sehe, dass Sie mehr eine Implementierung des Problems suchen, als diesen Fehler zu lösen. Hier haben Sie eine mögliche Lösung:

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

Das erste, was ich tun, ist immer die Liste der Kurse und dann filtern, indem Lehrer den Namen.

+0

tatsächlich ist es möglich, ohne Kette zu tun - '[i für x in courses.values ​​() für i in x.values() Wenn ich ["Lehrer"] == Person] ' –

+0

Ja, du hast Recht. Danke für den Vorschlag – moliware

Verwandte Themen