在循环中执行循环列表在python中有索引

时间:2011-08-24 23:20:45

标签: python list

假设我们的列表包含未知数量的索引,是否可以执行类似

的操作
i=0
while foo[i]:
    ...
    i+=1

在我的例子中,我得到错误,因为索引将超出范围,但我认为你得到了我想要的东西?

4 个答案:

答案 0 :(得分:12)

您正在寻找的是:

for i, elem in enumerate(foo):
    #i will equal the index
    #elem will be the element in foo at that index
    #etc...

enumerate内置需要一些序列(如列表或生成器),并产生一个元组,其中第一个元素包含迭代编号,其第二个元素包含值该迭代的序列。

由于您特别询问“未知数量的索引”,我还想澄清一下enumerate懒惰地工作。与len不同,enumerate需要提前计算/评估整个序列(假设您正在处理比简单列表更复杂的事情),因此无法获得无限列表,并且需要花费不确定的时间对于某些任意生成器函数(然后需要再次运行,可能导致副作用),import itertools for i, elem in enumerate(itertools.cycle('abc')): #This will generate - # i = 0, elem = 'a' # i = 1, elem = 'b' # i = 2, elem = 'c' # i = 3, elem = 'a' # and so on, without causing any problems. 仅评估列表中的下一个序列。这可以通过以下事实来显示:它将按照预期最简单的方式执行具有未知条目数的序列的示例:无限列表:

for ... enumerate ...

编辑 - 回应您的评论:

使用for本质上比仅使用enumerate更昂贵(假设您有额外i=0; i += 1的开销)。 然而,我认为如果你跟踪你的序列元素的索引,那么这个微小的开销对于它提供的非常pythonic的演示来说是一个很小的代价(也就是说, reversed是一种非常C风格的习语。

在做了一点搜索后,我挖出了(然后agf更正了网址)the source code for the enumerate function(另外,{{1}}函数)。它非常简单,它看起来并不昂贵。

答案 1 :(得分:6)

如果你有一个python列表,你可以使用for循环遍历列表:

for i in list

如果你必须使用while循环,你可以尝试

i=0
while i<len(foo):
  ...
  i+=1

答案 2 :(得分:4)

不是最流畅的方式,但你可以完全按照自己的方式行事,但要抓住例外。

i = 0
try:
    while foo[i]:
        ...
        i += 1
except IndexError:
    pass

这将在列表中的任何一点结束,其中元素具有测试为false的值,或者如果没有false值则处理整个列表。如果您想要的是始终处理整个列表,即使它包含错误值,请将while foo[i]更改为while 1。你必须在循环体中访问foo [i](我假设你还是想要)来触发异常并避免无限循环。

答案 3 :(得分:0)

您可以使用 for循环 while循环 Python提供了各种方法来迭代列表而不知道它的索引。

For循环:

for i in li:

或者您可以使用

for i in range(len(li))

在这种情况下,迭代器将是一个整数,它在各种情况下派上用场。

while循环:

while i<len(li):
   ----
   i = i+1

在python

中迭代列表时,我更喜欢使用for循环