一尘不染

访问“for”循环中的索引?

javascript

如何for在如下循环中访问索引?

ints = [8, 23, 45, 12, 78]
for i in ints:
    print('item #{} = {}'.format(???, i))

我想得到这个输出:

item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78

当我使用循环遍历它时for,如何访问循环索引,在这种情况下从 1 到 5?


阅读 184

收藏
2022-01-07

共2个答案

一尘不染

使用额外的状态变量,例如索引变量(您通常会在 C 或 PHP 等语言中使用),被认为是非 Python 的。

更好的选择是使用enumerate()Python 2 和 3 中都提供的内置函数:

for idx, val in enumerate(ints):
    print(idx, val)

查看PEP 279了解更多信息。

2022-01-07
一尘不染

使用 for 循环,如何访问循环索引,在这种情况下从 1 到 5?

用于enumerate在迭代时获取元素的索引:

for index, item in enumerate(items):
    print(index, item)

请注意,Python 的索引从零开始,因此您将获得 0 到 4 以上。如果您想要计数,1 到 5,请执行以下操作:

count = 0 # in case items is empty and you need it after the loop
for count, item in enumerate(items, start=1):
    print(count, item)

单惯控制流

您要的是 Pythonic 等效于以下内容,这是大多数低级语言程序员会使用的算法:

py index = 0 # Python's indexing starts at zero for item in items: # Python's for loops are a "for each" loop print(index, item) index += 1

或者在没有 for-each 循环的语言中:

py index = 0 while index < len(items): print(index, items[index]) index += 1

或者有时在 Python 中更常见(但单一地):

py for index in range(len(items)): print(index, items[index])

使用枚举函数

Python 的enumerate函数通过隐藏索引的说明来减少视觉混乱,并将可迭代enumerate对象封装到另一个可迭代对象(一个对象)中,该对象生成索引的两个项元组和原始可迭代对象将提供的项。看起来像这样:

for index, item in enumerate(items, start=0):   # default is zero
    print(index, item)

此代码示例是Python 惯用代码与非惯用代码之间差异的典型示例。惯用代码是复杂(但不复杂)的 Python,以它的预期使用方式编写。语言的设计者期望惯用代码,这意味着通常这些代码不仅更具可读性,而且更高效。

计数

即使你不需要索引,但你需要一个迭代的计数(有时是可取的)你可以开始,1最终的数字将是你的计数。

count = 0 # in case items is empty
for count, item in enumerate(items, start=1):   # default is zero
    print(item)

print('there were {0} items printed'.format(count))

当您说想要从 1 到 5 时,计数似乎更像是您想要的(而不是索引)。


分解 - 一步一步的解释

为了分解这些示例,假设我们有一个要使用索引迭代的项目列表:

items = ['a', 'b', 'c', 'd', 'e']

现在我们将这个迭代传递给枚举,创建一个枚举对象:

enumerate_object = enumerate(items) # the enumerate object

我们可以从这个迭代中拉出第一项,我们将使用该next函数进入循环:

iteration = next(enumerate_object) # first iteration from enumerate
print(iteration)

我们看到我们得到了0第一个索引和'a'第一个项目的元组:

(0, 'a')

我们可以使用所谓的“序列解包”从这个二元组中提取元素:

index, item = iteration
#   0,  'a' = (0, 'a') # essentially this.

当我们检查时index,我们发现它指的是第一个索引 0,并且item指的是第一项'a'

>>> print(index)
0
>>> print(item)
a

结论

  • Python 索引从零开始
  • 要在迭代时从可迭代对象中获取这些索引,请使用 enumerate 函数
  • 以惯用的方式使用 enumerate(连同元组解包)创建更具可读性和可维护性的代码:

所以这样做:

for index, item in enumerate(items, start=0):   # Python indexes start at zero
    print(index, item)
2022-01-07