2011-08-03 3 views
0

for 루프가 모든 다른 항목을 건너 뛰는 내 장고 응용 프로그램에서 이상한 문제가 발생했습니다. 반환 된 queryset을 가져 와서 반복하기 위해 list()을 처리했습니다. 이렇게하는 것은 POST 변수를 통해 뷰로 전달되는 다른 목록 안에있는 항목을 제거하는 것입니다. 이보기는 아약스 요청이며 페이지에 푸시되어야하는 항목의 JSON 목록을 리턴합니다. 다음 요청시 페이지는 이미 페이지에있는 객체의 ID 목록을 전달하므로 쿼리 세트에서 해당 객체를 제거하고 새 쿼리 만 다시 전달할 수 있습니다. 코드의 문제 부분에 여러 개의 print 문을 넣었고 페이지의 첫 번째 요청에서 아무 것도 표시되지 않아 목록이 페이지에 비어 있음을 알았습니다. 쿼리가 실행되고 결과가 페이지에 표시됩니다. 두 번째 요청에서 목록은 모든 ID가있는 페이지로 들어가며 문제가 발생한 곳입니다. 쿼리 세트를 반복하면서 ID가 목록에 있는지 확인하면서 홀수 값만 반복합니다 (제거되는) 페이지에 두 번째로 표시되도록 짝수 id 개체의 목록을 반환합니다.다른 모든 값을 건너 뛰는 파이썬 for 루프

코드 :

items = list(listobj.getItems()) 
temp = items 
print "Item List: ", temp 
print "Rendered List: ", request.POST['rendered'].split(',') 
for item in temp: 
    print "Item ID: ", str(item.id) 
    print "Rendered List: ", request.POST['rendered'].split(',') 
    if str(item.id) in request.POST['rendered'].split(','): 
     items.remove(item) 
     print "Removed Item: ", item.id 
print "Unrendered Items: ", [item.id for item in items] 

결과 :

[02/Aug/2011 20:17:25] "GET /list/list HTTP/1.1" 200 6256 
Item List: [<Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>] 
Rendered List: [u''] 
Item ID: 1 
Rendered List: [u''] 
Item ID: 2 
Rendered List: [u''] 
Item ID: 3 
Rendered List: [u''] 
Item ID: 4 
Rendered List: [u''] 
Item ID: 5 
Rendered List: [u''] 
Item ID: 6 
Rendered List: [u''] 
Item ID: 7 
Rendered List: [u''] 
Item ID: 8 
Rendered List: [u''] 
Item ID: 9 
Rendered List: [u''] 
Unrendered Items: [1, 2, 3, 4, 5, 6, 7, 8, 9] 
[02/Aug/2011 20:17:25] "POST /items/ HTTP/1.1" 200 528 
Item List: [<Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>, <Item: Item object>] 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Item ID: 1 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Removed Item: 1 
Item ID: 3 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Removed Item: 3 
Item ID: 5 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Removed Item: 5 
Item ID: 7 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Removed Item: 7 
Item ID: 9 
Rendered List: [u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9'] 
Removed Item: 9 
Unrendered Items: [2, 4, 6, 8] 
[02/Aug/2011 20:17:55] "POST /items/ HTTP/1.1" 200 252 

답변

5

tempitemsitems.remove()을 수행 할 때 그래서 당신은 또한 temp을 수정하고, 같은 객체를 참조하십시오. 목록의 값을 복사하려면 temp = items[:]을 사용하고 싶을 것입니다.

+0

+1, 좋은 캐치 처음 두 줄에 포스터의 의도를하지 않았다 :

어쨌든,이 당신의 작업을 할 수있는 더 간결하고 성능이 좋은 코드입니다. ('temp = list (items)'는 더 관용적 일 수 있습니다.) – GaretJax

1

데이터 구조를 반복하는 동안 데이터 구조를 수정해서는 안됩니다.

items = list(listobj.getItems()) 
rendered = set((int(i) for i in request.POST['rendered'].split(','))) 
unrendered = [item for item in items if item.id not in rendered] 
+0

현재의 print 서술문은 모두 디버깅을위한 것이라고 가정합니다. –