Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,当列表具有索引时执行循环_Python_List - Fatal编程技术网

在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()内置函数。