访问“for”循环中的索引使用 for 循环,如何访问循环索引(在本例中为 1 到 5?)单一控制流程使用枚举函数结论

2022-09-05 00:43:52

如何在使用循环循环迭代序列时访问索引?for

xs = [8, 23, 45]

for x in xs:
    print("item #{} = {}".format(index, x))

所需输出:

item #1 = 8
item #2 = 23
item #3 = 45

答案 1

使用内置函数 enumerate()

for idx, x in enumerate(xs):
    print(idx, x)

通过手动索引或手动管理其他状态变量是非 pythonic 的。for i in range(len(xs)): x = xs[i]

查看 PEP 279 了解更多信息。


答案 2

使用 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等价物,这是大多数低级语言程序员会使用的算法:

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 循环的语言中:

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

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

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

使用枚举函数

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

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

这个代码示例很好地说明了Python惯用代码与非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.

当我们检查时,我们发现它指的是第一个索引0,并引用了第一个项目。indexitem'a'

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

结论

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

所以这样做:

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

推荐