Python - 在for循环中更新字典

时间:2013-12-15 00:00:02

标签: python for-loop dictionary

我想在字典中每个时期保存我的成绩

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}

2 个答案:

答案 0 :(得分:1)

两个内部循环看似错误,您想要遍历句点同时,而不是遍历每个等级的所有句点(这是将循环嵌套在另一个循环中所造成的效果。)< / p>

假设有相同数量的成绩和句号,建立字典的正确方法是:

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

执行此操作的“长”方式(根据评论中的要求)将是:

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

另请注意,最后您只会获得一个包含最后一个类的句点/成绩的字典,因为您正在为每个类重复并创建一个新字典并丢弃以前的字典。

答案 1 :(得分: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()解决了我的问题。