如何在Python中同时获取列表索引和元素?

30

我经常发现自己写下如下代码:

k = 0
for i in mylist:
    # y[k] = some function of i
    k += 1

相反,我可以这样做

for k in range(K):
    # y[k] = some function of mylist[k]

但这似乎不太符合 "Pythonic" 的思想(你知道... 索引。呸!)。有没有一些语法可以让我同时使用循环、列表推导式或生成器提取索引 (k) 和元素 (i)?由于在科学计算中,循环体内有很多东西,因此仅使用列表推导式可能不够强大。

我也欢迎关于相关概念的提示,谢谢。

2个回答

62
你可以使用enumerate
for k,i in enumerate(mylist):
    #do something with index k
    #do something with element i

有关循环技巧的更多信息。

编辑:
正如评论中指出的那样,使用其他变量名称,例如

for i, item in enumerate(mylist):

使用有意义的变量名可以使你的代码在长期阅读和理解时更容易。通常,你应该使用ijk来表示数字,用有意义的变量名来描述列表中的元素。
举个例子,如果你有一个书籍列表并进行迭代,那么你应该将变量命名为book


3
enumerate 函数允许你使用 start 参数来指定起始索引位置,这在某些情况下非常方便。详见 http://docs.python.org/library/functions.html#enumerate。 - jps
1
我可能是唯一一个这样想的人,但是在代码中使用i作为变量来保存可迭代对象的每个元素会让我感到困惑。在循环代码中,ij不是常见的索引变量名吗? - Will McCutchen
1
但是请注意,如果您只想循环遍历列表的某些元素而不是整个列表,则起始参数是将分配给第一个提取的项目的数字,而不是原始列表中的索引。如果您编写 for i, item in enumerate(mylist, start=12) ,则可以从列表中获取每个项目,并从12开始计数。同样,如果您仅遍历切片但未设置起始值,则i从0开始。希望这能帮助到某些人。 - ViennaMike

20

enumerate 就是答案:

for index, element in enumerate(iterable):
    #work with index and element

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接