[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?




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



你也可以試試這個:

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']



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]) ,則會為此元素創建一個子列表。




你已經收到了很多解釋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



你可以用下面的代碼來完成它:

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



老式的方式:

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



首先,索引將從0到4.編程語言從0開始計數; 不要忘記,否則你會遇到索引超出界限例外。 您在for循環中所需的全部變量是一個從0到4的變量,如下所示:

for x in range(0, 5):

請記住,我寫了0到5,因為循環在最大值之前停止了一個數字。 :)

獲取索引使用的值

list[index]