协慌网

登录 贡献 社区

在'for' 循环中访问索引?

如何访问索引本身以获取如下列表?

ints = [8, 23, 45, 12, 78]

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

答案

使用附加的状态变量,例如索引变量(通常在 C 或 PHP 等语言中使用),被认为是非 pythonic。

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

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

查看PEP 279了解更多信息。

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

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

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

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

for count, item in enumerate(items, start=1):
    print(count, item)

Unidiomatic 控制流程

您要求的是 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函数通过隐藏索引的会计,并将 iterable 封装到另一个迭代( enumerate对象)中来减少视觉混乱,该迭代产生索引的两项元组和原始迭代将提供的项。看起来像这样:

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

这段代码示例相当于 Python 的惯用代码和非代码的代码之间差异的规范示例。惯用代码是复杂的(但并不复杂)Python,以其打算使用的方式编写。惯用语代码是该语言的设计者所期望的,这意味着通常这些代码不仅更具可读性,而且更高效。

算一算

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

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']

现在我们传递这个 iterable 来枚举,创建一个枚举对象:

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 索引从零开始
  • 要在迭代时从迭代中获取这些索引,请使用枚举函数
  • 以惯用的方式使用枚举(以及元组解包)创建更易读和可维护的代码:

这样做:

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

0以外的1开始它非常简单:

for index, item in enumerate(iterable, start=1):
   print index, item

注意

重要提示,虽然有点误导,因为index将是一个tuple (idx, item) 。很高兴去。