假设我们的列表包含未知数量的索引,是否可以执行类似
的操作i=0
while foo[i]:
...
i+=1
在我的例子中,我得到错误,因为索引将超出范围,但我认为你得到了我想要的东西?
答案 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循环