Python`for`不在枚举对象上迭代
为什么不迭代呢Python`for`不在枚举对象上迭代,python,loops,iteration,python-3.4,enumerable,Python,Loops,Iteration,Python 3.4,Enumerable,为什么不迭代呢 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
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:[[]]
文件:
logging.debug(list(e))
时,您已经在list()函数中使用了它,因此耗尽了它。因此,以下在for
循环中使用它的尝试没有给出任何结果
在调试后再次调用enumerate()时,如果使用修改后的代码,脚本行为将发生更改-它将在y[int(k)]上引发Indexer;我不会为您解决这个问题,但这足以表明循环体开始执行。任何迭代器都是“一次性”的,因为当它完全执行时,它将变为空,无法再使用。当您调用logging.debug(list(e))
时,您已经在list()函数中使用了它,因此耗尽了它。因此,以下在for
循环中使用它的尝试没有给出任何结果
在调试后再次调用enumerate()时,如果使用修改后的代码,脚本行为将发生更改-它将在y[int(k)]上引发Indexer;我不会为您解决这个问题,但这足以表明循环体开始执行。这一行:
logging.debug( list(e) )
消耗迭代器,因此当您到达此处时:
for k, v in e:
# ...
e
已用完。此行:
logging.debug( list(e) )
消耗迭代器,因此当您到达此处时:
for k, v in e:
# ...
e
已用尽。因为枚举
返回迭代器:
>>> 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.下一步()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
停止迭代
因此,您不能在e
上迭代两次。您必须重新创建迭代器。因为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.下一步()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
停止迭代
因此,您不能在e
上迭代两次。您必须重新创建迭代器。请尝试以下方法:
e = list(enumerate(d))
请尝试以下方法:
e = list(enumerate(d))
Try:enumerate(d)中的k,v:Try:enumerate(d)中的k,v:“任何迭代器都是“一次性的”,在这个意义上,当它被完全执行时,它将变为空并且不能再使用”:这不是真的。您可以轻松编写一个无限迭代器,itertools
中有几个迭代器,如count()
、cycle()
和repeat()
@brunodesthuilliers,它们不会使语句无效。这些都是迭代器不会耗尽的例子。@Marcin:半空杯vs半满杯。。。但是Python新手应该知道,并不是所有的迭代器都是有限的。“任何迭代器都是“一次性的”,在这个意义上,当它被完全执行时,它会变成空的,并且不能再使用”:这不是真的。您可以轻松编写一个无限迭代器,itertools
中有几个迭代器,如count()
、cycle()
和repeat()
@brunodesthuilliers,它们不会使语句无效。这些都是迭代器不会耗尽的例子。@Marcin:半空杯vs半满杯。。。但是Python新手应该知道并不是所有的迭代器都是有限的。你能在回答的同时添加一些额外的信息吗?你能在回答的同时添加一些额外的信息吗?