python - 枚举next()不起作用

时间:2015-01-12 11:05:11

标签: python django

l = []
for i, obj in enumerate(queryset):
    if queryset[i].next():
        if queryset[i].common_id == queryset[i+1].common_id:
            l.append(queryset[i])

但我得到了:

'MyModel' object has no attribute 'next'

the docs说:

  

enumerate()返回的迭代器的next()方法返回一个   包含计数和元组的元组   迭代序列获得的值

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您正在讨论的next()方法是enumerate返回的迭代器。例如:

>>> someIterator = enumerate(range(5,10))
>>> tuple = someIterator.next()
>>> tuple
(0, 5)

执行for循环时,for循环每步调用enumerate(...).next()。就像你在C for (i=0;i<10;i++)做的那样,在循环的核心,你不必再增加i

如果在你的循环中你只需要访问一些对象,那么你应该注意最后一步:

>>> l = range(5,10)
>>> for i, obj in enumerate(l):
...   print l[i],l[i+1]
...
5 6
6 7
7 8
8 9
9
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list index out of range
>>>

而只使用范围:

>>> for i in range(len(l)-1):
...   print l[i],l[i+1]
...
5 6
6 7
7 8
8 9

因为在你的循环中,你无论如何也不会使用obj 您还可以特别注意最后一步:

>>> l = range(5,10)
>>> for i, obj in enumerate(l):
...   if i<len(l)-1:
...     print l[i],l[i+1]
...   else:
...     print l[i]
...
5 6
6 7
7 8
8 9
9

或者在while循环中使用迭代器(当没有项时,next()会引发StopIteration

>>> someIterator = enumerate("abcde")
>>> current = someIterator.next()
>>> try:
...     while someIterator:
...        nextOne = someIterator.next()
...        print current, nextOne
...        if current == nextOne:
...           pass#dosomething
...        current = nextOne
... except:
...     print "end of iteration", current
...
(0, 'a') (1, 'b')
(1, 'b') (2, 'c')
(2, 'c') (3, 'd')
(3, 'd') (4, 'e')
end of iteration (4, 'e')

答案 1 :(得分:1)

可能更好的方法是在列表理解中使用zip

l = [item for item, next_item in zip(queryset, queryset[1:])
         if item.common_id == next_item.common_id]