2013-12-15 5 views
2

내가 사전에 각 기간에 의해 내 성적을 저장하려고에 대한에 사전을 업데이트 결과파이썬 - 루프

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

"긴"방식으로 작성하는 방법을 보여줄 수 있습니까? (예 : 발전기 또는 목록 이해력을 사용하지 않음). 이 파이썬 구조를 보는 사람들은 실제 논리가 무엇인지 놓칠 수 있습니다. – MxyL

+0

@MxyL 파이썬으로 익숙한 사람이라면 누구나 사용하는 구문을 이해할 것입니다. –

+0

모든 클래스의 마침표/등급으로 사전을 만들려면 어떻게해야합니까? –