[英]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
原因。
有幾種方法可以解決此問題:
正如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])
try... except
:
try: print(img_files_list[i]) print(img_files_list[i + 1]) print(img_files_list[i + 2]) except IndexOutOfRangeException: pass
限制循環范圍:
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_list
的if 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_list
的if img in new_list
可能是錯誤的,因為它只跳過了最后1-2個最后一項。 如果不存在,您要做的就是復制此列表並打印其內容。 在這種情況下,我建議:
imgs = os.listdir('/path/to/directory')
print('\n'.join(imgs))
但是,如果您弄清楚自己要做什么,我可以編輯此答案。
從我的評論到您的問題:
index + 1
和index + 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.