2013-09-21 39 views
25

Tôi đang cố gắng xác định một thủ tục, involved(courses, person), lấy làm đầu vào cấu trúc khóa học và một người và trả về một từ điển mô tả tất cả các khóa học mà người đó tham gia vàoLoạiError: chuỗi chỉ số phải là số nguyên, không str // làm việc với dict

đây là involved(courses, person) chức năng của tôi:.

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

Dưới đây là từ điển của tôi:

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

Khi tôi đang cố gắng để kiểm tra mã của tôi:

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

Python cho tôi một lỗi:

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

Làm thế nào tôi có thể khắc phục điều đó?

Cảm ơn.

Trả lời

29

time1 là chìa khóa của từ điển ngoài cùng nhất, ví dụ: feb2012. Vì vậy, sau đó bạn đang cố gắng để chỉ mục chuỗi, nhưng bạn chỉ có thể làm điều này với số nguyên. Tôi nghĩ những gì bạn muốn là:

for info in courses[time1][course]: 

Khi bạn thực hiện từng từ điển, bạn phải thêm tổ khác.

5

Thật sự tôi nghĩ rằng cách tiếp cận tổng quát hơn để lặp qua từ điển là sử dụng 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 

đầu ra:

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

Hoặc, như Matthias đề cập trong các ý kiến, nếu bạn không cần , bạn chỉ có thể sử dụng itervalues():

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

Thay vào đó, khi bạn không cần khóa, bạn có thể sử dụng [itervalues] (http://docs.python.org/2/library/stdtypes.html#dict.itervalues). – Matthias

+0

Vâng, cảm ơn thêm, tôi không biết liệu OP có muốn sử dụng các khóa hay không, nhưng tôi cần lưu ý rằng –

0

Tôi thấy rằng bạn đang tìm kiếm một sự thực hiện của vấn đề hơn là giải quyết lỗi đó. Ở đây bạn có một giải pháp có thể:

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

Điều đầu tiên tôi làm là lấy danh sách các khóa học và sau đó lọc theo tên của giáo viên.

+0

thực sự có thể thực hiện mà không có chuỗi - '[i cho x trong courses.values ​​() cho i in x.values() nếu tôi ["giáo viên"] == người] ' –

+0

Đúng, bạn nói đúng. Cám ơn vì sự gợi ý – moliware

Các vấn đề liên quan