2013-12-15 4 views
2

Я пытаюсь сохранить свои оценки по каждому периоду в словареPython - Обновление словаря в цикле

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 только имеет последний период {'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

Как я могу создать словарь с периодами/классами всех классов? –

Смежные вопросы