python迭代器索引 - 数组python




在'for'循环中访问索引? (14)

使用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的惯用代码和非代码的代码之间差异的canonical示例。 惯用代码是复杂的(但并不复杂)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)

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

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

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


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

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

注意

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


使用for循环打印列表推导中的(索引,值)元组:

ints = [8, 23, 45, 12, 78]
print [(i,ints[i]) for i in range(len(ints))]

输出:

[(0, 8), (1, 23), (2, 45), (3, 12), (4, 78)]

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

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

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

查看PEP 279了解更多信息。


在你的问题中,你写“如何访问循环索引,在这种情况下从1到5?”

但是,列表的索引从零开始。 那么,我们需要知道你真正想要的是列表中每个项目的索引和项目,或者你是否真的想要从1开始的数字。幸运的是,在python中很容易做到其中之一或两者。

首先,为了澄清,枚举函数迭代地返回列表中每个项的索引和对应项。

alist = [ 1, 2, 3, 4, 5 ]

for n,a in enumerate(alist):
    print( "%d %d"%(n,a) )

那么上面的输出是,

0 1
1 2
2 3
3 4
4 5

请注意,索引从0开始。这种索引在包括python和c在内的现代编程语言中很常见。

如果希望循环跨越列表的一部分,则可以将标准python语法用于列表的一部分。 例如,要从列表中的第二个项目循环到但不包括最后一个项目,您可以使用

for n,a in enumerate(alist[1:-1]):
    print( "%d %d"%(n,a) )

请注意,输出索引再次从0开始,

0 2
1 3
2 4

这将我们带到enumerate()的start = n开关。 这只是简单地抵消索引,你可以等效地简单地在循环内的索引中添加一个数字。

for n,a in enumerate(alist,start=1):
    print( "%d %d"%(n,a) )

输出为

1 1
2 2
3 3
4 4
5 5

如果列表中没有重复值:

for i in ints:
        indx=ints.index(i)
        print(i,indx)

而是使用enumerate.

for counter, value in enumerate(ints):
    print(counter, value)

或使用以下:

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

您可以使用index方法

ints = [8, 23, 45, 12, 78]
inds = [ints.index(i) for i in ints]

编辑在注释中突出显示如果ints有重复项,此方法不起作用,下面的方法应该适用于ints任何值:

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup[0] for tup in enumerate(ints)]

或者

ints = [8, 8, 8, 23, 45, 12, 78]
inds = [tup for tup in enumerate(ints)]

如果你想将ints的索引和值作为元组列表获取。

它使用了这个问题的选定答案中的enumerate方法,但是使用列表理解,使用更少的代码使其更快。


您可以使用以下代码执行此操作:

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

for value in (ints):
    index +=1
    print index, value

如果需要在循环结束时重置索引值,请使用此代码:

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

for value in (ints):
    index +=1
    print index, value
    if index >= len(ints)-1:
        index = 0

我不知道以下是否是pythonic,但它使用Python函数enumerate并打印索引和值。

int_list = [8, 23, 45, 12, 78]
for index, value in enumerate(int_list):
   print(index, value)

输出:

0 8
1 23
2 45
3 12
4 78

根据这个讨论: http://bytes.com/topic/python/answers/464012-objects-list-indexhttp://bytes.com/topic/python/answers/464012-objects-list-index

循环计数器迭代

循环索引的当前惯用法使用内置的“范围”函数:

for i in range(len(sequence)):
    # work with index i

循环使用元素和索引可以通过旧的习语或使用新的“zip”内置函数[2]来实现:

for i in range(len(sequence)):
    e = sequence[i]
    # work with index i and element e

要么

for i, e in zip(range(len(sequence)), sequence):
    # work with index i and element e

通过http://www.python.org/dev/peps/pep-0212/


老式的方式:

for ix in range(len(ints)):
    print ints[ix]

列表理解:

[ (ix, ints[ix]) for ix in range(len(ints))]

>>> ints
[1, 2, 3, 4, 5]
>>> for ix in range(len(ints)): print ints[ix]
... 
1
2
3
4
5
>>> [ (ix, ints[ix]) for ix in range(len(ints))]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
>>> lc = [ (ix, ints[ix]) for ix in range(len(ints))]
>>> for tup in lc:
...     print tup
... 
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
>>> 

这个问题的最佳解决方案是使用枚举内置python函数。
枚举返回元组
第一个值是索引
第二个值是该索引处的数组元素

In [1]: ints = [8, 23, 45, 12, 78]

In [2]: for idx, val in enumerate(ints):
   ...:         print(idx, val)
   ...:     
(0, 8)
(1, 23)
(2, 45)
(3, 12)
(4, 78)

首先,索引将从0到4.编程语言从0开始计数; 不要忘记,否则你会遇到索引超出范围的异常。 for循环中所需要的只是一个从0到4的变量,如下所示:

for x in range(0, 5):

请记住,我写了0到5,因为循环在最大值之前停止了一个数字。 :)

获取索引使用的值

list[index]

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






list