Python для цикла, пропускающего все остальные значения - PullRequest
1 голос
/ 03 августа 2011

Я столкнулся со странной проблемой в моем приложении django, когда цикл for пропускает все остальные элементы. Я взял возвращенный набор запросов и list() ed для итерации. Смысл этого состоит в том, чтобы удалить элементы, которые находятся внутри другого списка, который передается в представление через переменную POST. Это представление является запросом ajax и возвращает список элементов JSON, которые необходимо отправить на страницу. при следующем запросе страница передает список идентификаторов объектов, которые уже находятся на странице, поэтому я могу удалить их из набора запросов и вернуть только новые. Я поместил несколько операторов print по всей проблемной части кода и выяснил, что при первом запросе со страницы список появляется на странице пустым, потому что там ничего не отображается. Запрос выполняется и возвращает все результаты, которые затем отображаются на странице. По второму запросу список попадает на страницу со всеми идентификаторами, и вот здесь возникает проблема: когда я перебираю набор запросов, проверяя, есть ли идентификаторы в списке, он перебирает только нечетные значения (которые удаляются) и возвращает список четных идентифицированных объектов для повторного отображения на странице.

код:

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

Ответы [ 2 ]

6 голосов
/ 03 августа 2011

temp и items относятся к одному и тому же объекту, поэтому, когда вы делаете items.remove(), вы также изменяете temp.Возможно, вы захотите сделать temp = items[:], чтобы скопировать значения из списка items.

2 голосов
/ 03 августа 2011

Вы не должны изменять структуру данных во время итерации по ней.

В любом случае, это более лаконичный и эффективный код для выполнения вашей операции:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...