Индекс вне диапазона при доступе к индексу следующей итерации в цикле в Python - PullRequest
0 голосов
/ 16 сентября 2018

В каталоге есть несколько файлов изображений, в которых мне нужно выполнить итерацию, где необходимо получить доступ к следующему значению итерации в текущей итерации.

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 голосов
/ 16 сентября 2018

Из моего комментария к вашему вопросу:

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]
0 голосов
/ 16 сентября 2018

Больше похоже на просмотр кода, чем на переполнение стека.

Когда вы достигнете последнего элемента в строке for image, img in enumerate(img_files_list), после последнего элемента нет элемента.Вот что вызывает IndexOutOfRangeException.

. Есть несколько способов приблизиться к этому:

  1. Как писал Срути В., включите условие:

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

NB Я не уверен, что вы даже пытаетесь сделать.Даже ваш if img in new_list может быть ошибкой, поскольку он пропускает последние 1-2 последних пункта.И если этого не будет, все, что вы будете делать, это сделать копию этого списка и распечатать его содержимое.В этом случае я бы предложил:

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

Но если вы уточните, что вы пытаетесь сделать, я могу отредактировать этот ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...