在Python中循环遍历具有索引的列表

6 投票
4 回答
73591 浏览
提问于 2025-04-17 00:18

假设我们有一个列表,里面的索引数量不确定,能不能做一些类似这样的操作呢?

i=0
while foo[i]:
    ...
    i+=1

在我的例子中,我遇到了错误,因为索引超出了范围。不过我想你明白我想表达的意思吧?

4 个回答

4

这不是最顺畅的方法,但你可以像之前那样做,只不过要捕捉异常。

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

这样做的话,如果列表中的某个元素的值被判断为假,就会在那个点结束;如果没有假值,就会处理整个列表。如果你想要无论列表中有没有假值都处理整个列表,可以把 while foo[i] 改成 while 1。不过你需要在循环体内访问 foo[i](我想你本来就想这样做),这样才能触发异常,避免出现无限循环。

8

如果你有一个Python列表,你可以用for循环来遍历这个列表:

for i in list

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

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

你要找的是:

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 那样需要提前计算整个序列(假设你处理的不是简单的列表),所以如果是无限列表,它会失败;而对于某些复杂的生成器函数,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 的调用。不过,我认为如果你需要跟踪序列元素的索引,这点小开销是值得的,因为它能让代码看起来更符合 Python 的风格(也就是说,i=0; i += 1 这种写法更像 C 语言的风格)。

我查了一下,找到了 enumerate 函数的源代码(还有 reversed 函数)。这个代码很简单,跟着看也不复杂,开销看起来也不大。

撰写回答