【问题标题】:Python `for` does not iterate over enumerate objectPython `for` 不会遍历枚举对象
【发布时间】:2015-01-23 06:40:52
【问题描述】:

为什么不迭代?

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 )

输出:

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

文档:

在线运行:http://goo.gl/75yuAd

【问题讨论】:

  • 尝试:for k, v in enumerate(d):

标签: python loops iteration python-3.4 enumerable


【解决方案1】:

因为enumerate 返回一个迭代器:

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

一旦到达终点,e.next() 就会引发 StopIteration 异常:

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

因此,您不能对 e 进行两次迭代。您将不得不重新创建迭代器。

【讨论】:

    【解决方案2】:

    从某种意义上说,任何迭代器都是“一次性的”,当它完全执行时,它会变为空且不能再使用。当你调用logging.debug( list(e) ) 时,你已经在 list() 函数中使用了它,所以用尽了它。因此,在for 循环中使用它的以下尝试没有给出任何结果。

    在调试后再次调用 enumerate() 时修改代码,脚本行为会发生变化 - 它会在 y[int(k)].append( v ) 上引发 IndexError;我不会为你解决这个问题,但这足以表明循环体开始执行。

    【讨论】:

    • “任何迭代器在某种意义上都是“一次性”的,当它完全执行时,它会变成空的,不能再使用了”:这不是真的.您可以轻松编写无限迭代器,itertools 中有几个,例如 count()cycle()repeat()
    • @brunodesthuilliers 这不会使声明无效。这些是不会耗尽的迭代器示例。
    • @Marcin: half-empty glass vs half-full glass...但是 Python 新手应该知道并不是所有的迭代器都是有限的。
    【解决方案3】:

    这一行:

    logging.debug( list(e) )
    

    消耗迭代器,所以当你到达这里时:

    for k, v in e:
       # ...
    

    e 已经用尽了。

    【讨论】:

      【解决方案4】:

      试试这个:

      e = list(enumerate(d))
      

      【讨论】:

      • 您能否在回答的同时添加一些其他信息?
      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 2010-12-12
      • 2011-09-01
      • 2021-04-11
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多