Python `for` does not iterate over enumerate object

梦想的初衷 提交于 2019-12-31 05:26:30

问题


Why does this not iterate?

import logging
logging.basicConfig(level=logging.DEBUG)

x = []
y = [[] for n in range(0, 1)]
linedata = ["0","1","2"]
x.append( linedata[0] )

d = linedata[1:] 
logging.debug( "d: {}".format(d) )
e = enumerate(d)
logging.debug( list(e) )
for k, v in e:
  logging.debug( "k:{} v:{}".format( k, v ) )
  y[int(k)].append( v )
  #for d in [(0,1)]:
  #logging.debug( "k:{} v:{}".format( d[0], d[1] ) )
  #y[d[0]].append( d[1] )

logging.debug( x )
logging.debug( y )

Output:

DEBUG:root:d: ['1', '2']
DEBUG:root:[(0, '1'), (1, '2')]
DEBUG:root:['0']
DEBUG:root:[[]]

Docs:

  • https://docs.python.org/3/reference/compound_stmts.html#for
  • https://docs.python.org/3/library/functions.html#enumerate

Run online: http://goo.gl/75yuAd


回答1:


Any iterator is "one-shot" in sense that, when it is fully executed, it becomes empty and can't be used anymore. When you called logging.debug( list(e) ), you have used it in the list() function and so exhausted it. So, the following attempt to use it in for cycle gives nothing.

With modified code when enumerate() is called again after this debug, the script behavior gets changed - it raises IndexError on y[int(k)].append( v ); I won't fix this for you but this is enough sign that cycle body begins being executed.




回答2:


Because enumerate returns an iterator:

>>> e = enumerate(range(4))
>>> list(e)
[(0, 0), (1, 1), (2, 2), (3, 3)]
>>> list(e)
[]

Once the end is reached, e.next() raises a StopIteration exception:

>>> e.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

Thus you cannot iterate twice over e. You will have to recreate the iterator.




回答3:


this line :

logging.debug( list(e) )

consumes the iterator, so when you get here:

for k, v in e:
   # ...

e is already exhausted.




回答4:


try this instead:

e = list(enumerate(d))


来源:https://stackoverflow.com/questions/27123695/python-for-does-not-iterate-over-enumerate-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!