2013-09-21 47 views
25

我想要定義一個過程,involved(courses, person),需要輸入一個課程結構和一個人,並返回一個字典,描述該人是所有課程參與TypeError:字符串索引必須是整數,而不是字符//使用字典

這裏是我的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 

我該如何解決呢?

謝謝。

回答

29

time1是最外面字典的關鍵字,例如feb2012。所以你試圖索引字符串,但你只能用整數來完成。我想你想要的是:

for info in courses[time1][course]: 

當你瀏覽每個字典時,你必須添加另一個嵌套。

5

其實我認爲,通過字典來循環更通用的方法是使用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 
+0

如果您不需要密鑰,則可以使用[itervalues](http://docs.python.org/2/library/stdtypes.html#dict.itervalues)。 – Matthias

+0

是的,謝謝你的補充,我不知道OP是否要使用密鑰,但我應該注意到, –

0

我發現你正在尋找解決這個問題的方法,而不是解決這個錯誤。這裏有一個可能的解決方案:

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

我做的第一件事就是讓課程的列表,然後通過老師的名字進行篩選。

+0

實際上它可以在沒有鏈的情況下執行 - 「[我爲x in courses.values()for i in x.values ()如果我[「老師」] ==人]' –

+0

是的,你說得對。感謝您的建議 – moliware

相關問題