目录中有几个图像文件,我需要对其进行遍历,其中需要访问当前迭代中的下一个迭代值。
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 的所有项目,但是在循环末尾到达时,需要正确地退出循环,而没有索引超出范围例外 。任何人,请指出我在哪里错过了逻辑。
答案 0 :(得分:2)
似乎更像是代码审查,而不是堆栈溢出。
当您到达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
-您只是用它来跳过下两个。您可以使它更加优雅,并使用范围(解决方案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 + 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]