[Python] 访问'for'循环中的索引?


Answers

使用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的惯用代码和非代码代码之间区别的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']

现在我们通过这个迭代器枚举,创建一个枚举对象:

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

所以这样做:

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

如何访问索引本身的列表如下所示?

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

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




你也可以试试这个:

data = ['itemA.ABC', 'itemB.defg', 'itemC.drug', 'itemD.ashok']
x = []
for (i, item) in enumerate(data):
      a = (i, str(item).split('.'))
      x.append(a)
for index, value in x:
     print(index, value)

输出是

0 ['itemA', 'ABC']
1 ['itemB', 'defg']
2 ['itemC', 'drug']
3 ['itemD', 'ashok']



首先,索引将从0到4.编程语言从0开始计数; 不要忘记,否则你会遇到索引超出界限例外。 您在for循环中所需的全部变量是一个从0到4的变量,如下所示:

for x in range(0, 5):

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

获取索引使用的值

list[index]



你可以用下面的代码来完成它:

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



你已经收到了很多解释enumerate的答案,但是如果你只需要索引来访问两个列表中的匹配项,那么在Python 3: zip有另一种更简洁和更简单的方法。

例如,如果您使用索引为列表中的数字提取相应的名称,则可以这样做:

ints = [8, 23, 45, 12, 78]
names = ["John", "Sue", "Johannes", "Patel", "Ian"]
for int, name = zip(ints, names):
    print("{} - {}".format(name, int)

那会产生

8 - John
23 - Sue
45 - Johannes
12 - Patel
78 - Ian



老式的方式:

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)
>>> 



ints = [9, 23, 45, 12, 78]
ints.extend([1,2,3,4,5,6,7,8])
for idx, val in enumerate(ints):
    print(idx,val)

这样你可以扩展一个列表。 扩展意味着您可以一次添加多个值。

要追加这个列表,你必须写下面给出的代码:

ints = [9, 23, 45, 12, 78]
ints.append([1])
for idx, val in enumerate(ints):
    print(idx,val)

这样您可以一次添加一个值。 如果您编写ints.append([1]) ,则会为此元素创建一个子列表。




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