2013-09-21 10 views
25

Próbuję zdefiniować procedurę, involved(courses, person), która przyjmuje jako dane wejściowe strukturę kursów i osobę i zwraca słownik, który opisuje wszystkie kursy, którą dana osoba jest zaangażowany wTypeError: wskaźniki łańcuchowe muszą być liczbami całkowitymi, nie str // praca z dict

Oto moja involved(courses, person) funkcja.

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

Tu jest moja słownika:

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

Kiedy” Usiłuję przetestować mojego kodu:

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

Python dać mi błąd:

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

Jak mogę to naprawić?

Dzięki.

Odpowiedz

29

time1 jest kluczem do najbardziej zewnętrznego słownika, np. feb2012. Więc próbujesz zindeksować ciąg, ale możesz to zrobić tylko z liczbami całkowitymi. Myślę, że chciałeś:

for info in courses[time1][course]: 

Podczas przeglądania każdego słownika musisz dodać kolejne gniazdo.

5

Właściwie myślę, że bardziej ogólne podejście do pętli słownika jest użycie 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 

wyjściowa:

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

Albo, jak Matthias wspomniano w komentarzach, jeśli nie musisz kluczami, możesz po prostu użyć itervalues():

+0

Gdy nie potrzebujesz klucza, możesz zamiast tego użyć [itervalues] (http://docs.python.org/2/library/stdtypes.html#dict.itervalues). – Matthias

+0

Tak, dziękuję za dodanie, nie wiem, czy OP chce używać kluczy, ale powinienem zauważyć, że –

0

Widzę, że szukasz rozwiązania problemu bardziej niż rozwiązanie tego błędu. Tutaj masz możliwe rozwiązanie:

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

Pierwszą rzeczą, którą robię jest uzyskanie listy kursów, a następnie filtrowanie według nazwiska nauczyciela.

+0

faktycznie można zrobić bez łańcucha - '[i dla x w courses.values ​​() dla i w x.values() jeśli ja ["nauczyciel"] == osoba] ' –

+0

Tak, masz rację. Dzieki za sugestie – moliware

Powiązane problemy