在python中,当列表具有索引时执行循环
假设我们有一个索引数量未知的列表,是否可以这样做在python中,当列表具有索引时执行循环,python,list,Python,List,假设我们有一个索引数量未知的列表,是否可以这样做 i=0 while foo[i]: ... i+=1 在我的示例中,由于索引超出范围,我得到了错误,但我认为您得到了我想要的?您要查找的是: for i, elem in enumerate(foo): #i will equal the index #elem will be the element in foo at that index #etc... 内置函数获取一些序列(如列表或生成器),并生
i=0
while foo[i]:
...
i+=1
在我的示例中,由于索引超出范围,我得到了错误,但我认为您得到了我想要的?您要查找的是:
for i, elem in enumerate(foo):
#i will equal the index
#elem will be the element in foo at that index
#etc...
内置函数获取一些序列(如列表或生成器),并生成一个元组,元组的第一个元素包含迭代编号,第二个元素包含该迭代的序列值
由于您专门询问了“未知数量的索引”,我还想通过添加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风格的习惯用法)来说是一个很小的代价
在做了一点搜索之后,我找到了(然后agf更正了的url)(另外,
反转了
函数)。它非常简单,而且看起来一点也不贵。如果你有一个python列表,你可以用for循环遍历该列表:
for i in list
如果必须使用while循环,可以尝试
i=0
while i<len(foo):
...
i+=1
i=0
虽然我不是最顺利的方法,但是你可以完全按照你所做的去做,但是抓住了例外
i = 0
try:
while foo[i]:
...
i += 1
except IndexError:
pass
这将在列表中的任何一点结束,其中元素的值测试为false,或者如果没有false值,将处理整个列表。如果您希望始终处理整个列表,即使它包含false值,请将while foo[i]
更改为while 1
。您必须访问foo[i]在循环体中(我假设您无论如何都想)触发异常并避免无限循环。您可以使用for循环或while循环
Python提供了各种方法来迭代列表而不知道其索引
For循环:
for i in li:
while i<len(li):
----
i = i+1
或者你可以使用
for i in range(len(li))
在这种情况下,迭代器将是一个整数,它在各种情况下都很有用
While循环:
for i in li:
while i<len(li):
----
i = i+1
当我谈到性能时,哪种方法会更优化?如@MByD和will Response还是你的?是的,len可能会更长,但如果只是列表中的i呢?catch Indexer:^SyntaxError:无效的syntaxit's可能除外,相反catch如果是生成器或迭代器,则无法执行此操作,因为它们没有__len_uu
魔术方法。那么,您真的需要i
值吗,或者您只是为了从foo
中获取元素而使用它吗?因为在Python中,我们通过实际迭代容器来迭代容器,而不是通过迭代索引来迭代。您似乎不了解Python列表的本质。它们会增长和收缩在动态方面,您总是可以使用len()内置函数检查它们的实际大小,并使用for循环迭代每个元素……当您需要枚举元素时,会出现enumerate()内置函数。