在python中循环访问下一次迭代的索引时索引超出范围

时间:2018-09-16 12:14:23

标签: python python-3.x list

目录中有几个图像文件,我需要对其进行遍历,其中需要访问当前迭代中的下一个迭代值。

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 的所有项目,但是在循环末尾到达时,需要正确地退出循环,而没有索引超出范围例外 。任何人,请指出我在哪里错过了逻辑。

2 个答案:

答案 0 :(得分:2)

似乎更像是代码审查,而不是堆栈溢出。

当您到达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_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也可能是一个错误,因为它只会跳过最后1-2个最后一项。如果不存在,您要做的就是复制此列表并打印其内容。在这种情况下,我建议:

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

但是,如果您明确说明要做什么,我可以编辑此答案。

答案 1 :(得分:0)

从我的评论到您的问题:

  

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]