Python用于每隔一个值跳过循环

2024-10-06 14:33:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我在django应用程序中遇到了一个奇怪的问题,for循环会跳过其他项目。我使用返回的queryset和list()进行迭代。这样做的目的是删除另一个列表中的项,该列表通过POST变量传递给视图。这个视图是一个ajax请求,返回一个JSON列表,其中列出了需要推送到页面上的项。在下一个请求中,页面将传递已经在页面上的对象的id列表,因此我可以从queryset中删除这些id,并只返回新的id。我在代码的问题部分放置了几个print语句,并发现在来自页面的第一个请求中,列表进入页面是空的,因为没有任何显示。查询运行并返回所有结果,然后显示在页面上。在第二个请求中,列表与所有id一起进入页面,这就是问题发生的地方:当我循环查询集,检查id是否在列表中时,它只迭代奇数值(已删除),并返回偶数id对象的列表,以便在页面上第二次显示。在

代码:

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]

结果:

^{pr2}$

Tags: inid列表forrequestitems页面item
2条回答

tempitems引用同一个对象,因此当你items.remove()时,你也在修改temp。您可能想做temp = items[:]来复制items列表的值。在

迭代数据结构时不应修改它。在

总之,这是一个更简洁、更高效的代码来执行您的操作:

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]

相关问题 更多 >