【问题标题】:Python for loop skipping every other valuePython for循环跳过所有其他值
【发布时间】:2011-08-03 01:20:50
【问题描述】:

我在我的 django 应用程序中遇到了一个奇怪的问题,其中 for 循环跳过了所有其他项目。我接受了一个返回的查询集和list()ed 进行迭代。这样做的目的是删除另一个列表中的项目,该列表通过 POST 变量传递给视图。此视图是一个 ajax 请求,并返回需要推送到页面的项目的 JSON 列表。在下一个请求时,页面传递页面上已经存在的对象的 ID 列表,因此我可以从查询集中删除这些对象并只传回新的对象。我在代码的问题部分放置了几个打印语句,并发现在页面的第一个请求中,列表进入页面是空的,因为没有显示任何内容。查询运行并返回所有结果,然后显示在页面上。在第二个请求中,列表进入带有所有 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]

结果:

    [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

【问题讨论】:

    标签: python django for-loop


    【解决方案1】:

    tempitems 指的是同一个对象,所以当您执行items.remove() 时,您也在修改temp。您可能想要使用temp = items[:] 来复制items 列表的值。

    【讨论】:

    • +1,不错,前两行没看懂发帖者的意图。 (temp = list(items) 可能更惯用)。
    【解决方案2】:

    您不应该在迭代数据结构时对其进行修改。

    无论如何,这是一个更简洁和高性能的代码来执行您的操作:

    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]
    

    【讨论】:

    • 假设当前的打印语句都只是为了调试,是的。
    猜你喜欢
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 2013-02-01
    • 2021-08-23
    相关资源
    最近更新 更多