在 "for "循环中访问索引。

python loops list


如何在如下所示的 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)?




Answer 1 Mike Hordecki


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

更好的选择是使用内置函数 enumerate() ,该函数在Python 2和3中都可用:

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

进一步了解PEP 279




Answer 2 Aaron Hall


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

在迭代时使用 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])

使用Enumerate函数

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

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

此代码示例很好说明了Python特有的代码与非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

Conclusion

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

所以要这样做。

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



Answer 3 A.J.


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

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

Note

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




Answer 4 David Hanak


for i in range(len(ints)):
   print i, ints[i]



Answer 5 Charitoo


按照Python的规范,有几种方法可以做到这一点。在所有示例中,假定: lst = [1, 2, 3, 4, 5]

1.使用枚举(被认为是最惯用的

for index, element in enumerate(lst):
    # do the things that need doing here

在我看来,这也是最安全的选择,因为已经消除了进入无限递归的机会。项目和它的索引都保存在变量中,不需要再写任何代码来访问项目。

2.创建一个变量来保存索引(使用 for

for index in range(len(lst)):   # or xrange
    # you will have to write extra code to get the element

3.创建一个变量来保存索引(使用 while

index = 0
while index < len(lst):
    # you will have to write extra code to get the element
    index += 1  # escape infinite recursion

4.总有另一种方式

如前所述,还有其他方法尚未在此处进行说明,它们甚至可能在其他情况下更适用。例如,itertools.chain 与for一起使用。它比其他示例更好地处理嵌套循环。