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

2024-04-19 07:07:12 发布

您现在位置:Python中文网/ 问答频道 /正文

如何像下面这样访问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的循环索引?


Tags: informatfor情况itemprintints
3条回答

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

更好的选择是使用内置函数^{},在Python 2和3中都有:

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

查看PEP 279了解更多信息。

Using a for loop, how do I access the loop index, from 1 to 5 in this case?

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

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

请注意,Python的索引从0开始,因此使用上面的方法可以得到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的^{} function通过隐藏索引的说明,并将iterable封装到另一个iterable(一个enumerate对象)中,该对象生成索引的两项元组和原始iterable将提供的项,从而减少了视觉混乱。看起来是这样的:

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,创建一个enumerate对象:

enumerate_object = enumerate(items) # the enumerate object

我们可以从这个iterable中提取第一个项,然后使用next函数循环:

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

我们得到一个元组0,第一个索引,'a',第一个项:

(0, 'a')

我们可以使用所谓的“sequence unpacking”从这两个元组中提取元素:

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

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

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

结论

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

这样做:

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

1而不是0开始很简单:

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

注意

重要提示,尽管有点误导,因为这里的index将是tuple(idx, item)。 很好去。

相关问题 更多 >