访问'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)
单向控制流程
你所要求的是以下的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
函数通过隐藏索引记帐并将迭代器封装到另一个可迭代( 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']
现在我们通过这个迭代器枚举,创建一个枚举对象:
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
结论
所以这样做:
for index, item in enumerate(items, start=0): # Python indexes start at zero
print(index, item)
这是很简单的,从它开始1
以外的0
:
for index in enumerate(iterable, start=1):
print index
注意
重要的提示,尽管有点误导,因为index
将在这里是一个tuple
(idx, item)
。 很好去。