Подтвердить что ты не робот

TypeError: строковые индексы должны быть целыми, а не str//работать с dict

Я пытаюсь определить процедуру, involved(courses, person), которая принимает в качестве входных данных структуру курсов и человека и возвращает словарь, который описывает все курсы, в которых участвует человек.

Вот моя функция involved(courses, person):

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

Вот мой словарь:

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

Когда я пытаюсь проверить свой код:

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

Python сообщит мне об ошибке:

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

Как я могу это исправить?

Спасибо.

4b9b3361

Ответ 1

time1 является ключом самого внешнего словаря, например feb2012. Итак, вы пытаетесь индексировать строку, но вы можете делать это только с помощью целых чисел. Я думаю, что вы хотели:

for info in courses[time1][course]:

Когда вы проходите через каждый словарь, вы должны добавить еще одно гнездо.

Ответ 2

На самом деле я считаю, что более общий подход к использованию словарного цикла заключается в использовании 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

выход:

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

Или, как упоминал Маттиас в комментариях, если вам не нужны ключи, вы можете просто использовать itervalues ​​():

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

Ответ 3

Я вижу, что вы ищете реализацию проблемы больше, чем решение этой ошибки. Здесь у вас есть возможное решение:

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

Первое, что я делаю, это получить список курсов, а затем отфильтровать имя учителя.