簡體   English   中英

在python中循環訪問下一次迭代的索引時索引超出范圍

[英]Index out of range while accessing index of the next iteration in loop in python

我需要在目錄中進行迭代的幾個圖像文件,需要在其中訪問當前迭代中的下一個迭代值。

img_files_list = os.listdir(/path/to/directory)
new_list = []
for index, img in enumerate(img_files_list):
    if img in new_list:
        continue
    new_list.extend([img, img_files_list[index + 1], img_files_list[index + 2]])
    print(img)
    print(img_files_list[index + 1])
    print(img_files_list[index + 2])

我需要遍歷img_files_list的所有項,但是當在循環末尾到達時,需要正確地退出循環,而不會出現索引超出范圍的異常 任何人,請指出我在哪里錯過了邏輯。

看起來更像是代碼審查,而不是堆棧溢出。

當您到達for image, img in enumerate(img_files_list)的最后一項時for image, img in enumerate(img_files_list)行中的for image, img in enumerate(img_files_list)最后一項之后沒有任何項。 這就是導致IndexOutOfRangeException原因。

有幾種方法可以解決此問題:

  1. 正如Sruthi V.所寫,包括一個條件:

     print(img_files_list[i]) if i + 1 < len(img_files_list): print(img_files_list[i + 1]) if i + 2 < len(img_files_list): print(img_files_list[i + 2]) 
  2. try... except

     try: print(img_files_list[i]) print(img_files_list[i + 1]) print(img_files_list[i + 2]) except IndexOutOfRangeException: pass 
  3. 限制循環范圍:

     i_img = list(enumerate(['a', 'b', 'c', 'd', 'e'])) for i, img in i_img [:len(i_img ) - 2]: print(img) print(i_img[i + 1]) print(i_img[i + 2]) 

請注意,您沒有理由使用enumerate -只是使用它來獲取索引。 您也不需要if img in new_listif img in new_list您只是使用它來跳過接下來的兩個。 您可以使它更加優雅,並使用范圍(解決方案3)來解決您的問題。

imgs = os.listdir('/path/to/directory')
triplets = []
for i in range(0, len(imgs) - 2, 3):
    triplet = [imgs[i], imgs[i + 1], imgs[i + 2]]
    triplets.extend(triplet)
    print('\n'.join(triplet))

注意:我不確定您要做什么。 即使您if img in new_listif img in new_list可能是錯誤的,因為它只跳過了最后1-2個最后一項。 如果不存在,您要做的就是復制此列表並打印其內容。 在這種情況下,我建議:

imgs = os.listdir('/path/to/directory')
print('\n'.join(imgs))

但是,如果您弄清楚自己要做什么,我可以編輯此答案。

從我的評論到您的問題:

index + 1index + 2導致最后2個項目出現問題。 例如,如果列表的大小為10,則索引將為0,2,...,9。 當索引為8和9時,您嘗試執行img_files_list[10]img_files_list[11] 因此索引超出范圍。

我假設您想以3項列表的形式訪問圖像,那么我建議您采取一些不同的方式。 為了更好的理解,我將使用整數數組而不是圖像。

img_files_list = [0,1,2,3,4,5,6,7,8,9]
new_list = []  
n = 3
for i in range(0, len(img_files_list), n): # Respectively, i is 0,3,6,9,...
    temp = img_files_list[i:i+n]
    print(temp)
    new_list.extend(temp)

輸出:

[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM