2013-12-15 153 views
2

我想每個時期保存我的成績在一本字典Python的 - 更新字典的for循環

for classes in soup.find_all("div", "AssignmentClass"): 
    grades = classes.findAll("span")[5] 
    periods = classes.findAll("a", "asmt_link") 
    final = {} 
    for i in grades: 
     for x in periods: 
      print "%s: %s" % (x.get_text(), i) 
      final.update({x.get_text():i}) 

結果:

Period 1: 97.00000 

Period 2: 84.93440 

Period 3: 25.83333 

Period 4: 86.38029 

Period 5: 86.15000 

Period 6: 86.87500 

Period 7: 66.76380 

但最終final不僅具有last period {'Period 7': 66.76380}

我想要的是:

{'Period 1': 97.00000, 'Period 2': 84.93440, 'Period 3': 25.83333, 'Period 4': 86.38029, 'Period 5': 86.15000, 'Period 6': 86.87500, 'Period 7': 66.76380} 

回答

0

我已經找到了一種方法來添加每個時期和成績的字典。

final={} 
for classes in soup.find_all("div", "AssignmentClass"): 
    grades = classes.findAll("span")[5] 
    periods = classes.findAll("a", "asmt_link") 
    for p, g in zip(periods, grades): 
       final.setdefault(p.get_text(), g) 

結果:

{'Period 1': 97.00000, 'Period 2': 84.93440, 'Period 3': 25.83333, 'Period 4': 86.38029, 'Period 5': 86.15000, 'Period 6': 86.87500, 'Period 7': 66.76380} 

使用.setdefault()解決我的問題。

1

兩個內環似乎錯了,你要穿越週期和檔次同時,不穿越所有周期,每個等級(這是造成中嵌套另一個循環的效果。)

假設有等級和週期的相同數量的構建一個字典將是正確的做法:

final = dict(zip((x.get_text() for x in periods), grades)) 

「長」的方式來做到這一點(如在意見中的要求)是:

final = {} 
for period, grade in zip(periods, grades): 
    final[period.get_text()] = grade 

還要注意的是,在結束時,你只會得到一個字典,最後一堂課的時間/等級,因爲你迭代和創建爲每個類一個新的字典,並放棄以前的字典。

+0

你能說明它是如何寫成「長」的嗎? (例如:不使用生成器或列表理解)。看着這些python結構的人可能會錯過實際的邏輯。 – MxyL

+0

@MxyL我認爲任何熟悉Python的人都會理解所使用的構造...... –

+0

如何創建一個包含所有類的句號/等級的字典? –