2015-01-14 3 views
0

Я задаюсь почему следующая ситуация может возникнуть:IndexError: список индексов вне диапазона, но я «знаю» это

У меня есть список:

all_hits = list1 + list2 
length_hits = len(all_hits) 
i = 0 
while i < int(length_hits) - 1: 
    if len((all_hits[i])[1]) >=3: 
     Do x 
    else: 
     Do y 

Это дает мне ошибку :

File "file.py", line z, in Function: 
    if len((all_hits[i])[1]) >= 3: 
IndexError: list index out of range 

до сих пор:

  1. Если я напишу каждый all_hits[i][1], который длится> = 3 символа в файл, я получаю около 18 000 записей, но если я напечатаю len(all_hits), то ответ будет 39 000 элементов.
  2. Я могу напечатать запись all_hits[-1] и она не соответствует окончательной записи в письменном списке.

Насколько я вижу, я не изменяю первоначальный список.

Почему? У меня было 2 дня на эту проблему, и это сводит меня с ума.

Редактировать: 3. Я напечатал заключительную запись и несколько после/до нее, чтобы убедиться, что у них есть правильное количество элементов, и все выглядит нормально.

Редактировать и поблагодарить:

Спасибо всем. Вы, конечно, были правы. Одна из моих записей имела, из ниоткуда, только один объект списка. Я не знаю, как и почему, но это совсем другой чай из рыбы!

Благодарим за помощь!

+2

Вы считаете, что внутренний список имеет как минимум два элемента '[1]'. Проверьте это. –

+1

Вы не тестировали, если 'all_hits [i]' содержит не менее 2 записей. –

+0

Спасибо за ваши комментарии. Я напечатал окончательную запись, которая будет записывать файл, и имеет две записи. Это похоже на «другие» записи. – poppyseeds

ответ

0

В этой строке if len((all_hits[i])[1]) >= 3: вы должны знать, что вы берете на себя двойное разыменованием [i][1]:

  • all_hits список списков. Например, [[1,2],[4,5],[7,8],[9]]
  • и каждый список в пределах all_hits имеет длину не менее 2 записей.

all_hits[0] относится к первому списку/записи в all_hits - [1,2] в моем примере.

Таким образом, all_hits[0][1] ссылается на второй элемент в списке примеров [1,2], а именно: 2.

Теперь вы можете себе представить, что когда вы доберетесь до четвертой записи в all_hits, а именно [9] в моем примере.

all_hits[3] = [9], а затем all_hits[3][1] находится вне границ, потому что у вас есть только одна запись, а именно all_hits[3][0]

Поэтому убедитесь, что каждый вложенный список длинный, по крайней мере 2 записей. Если вы знаете, что это так, у вас не должно возникнуть проблемы.Скорее попробовать это:

all_hits = list1 + list2 
    i = 0 
    while i <= len(all_hits) - 1: 
     if len(all_hits[i][1]) >=3: 
      Do x 
     else: 
      Do y 
     i += 1  
1

В Python, вам не нужно знать длину списка, чтобы пройти через него. Во-вторых, не думайте, длина внутреннего элемента, попробовать и посмотреть, если это то, что вы ожидаете:

for something in all_hits: 
    try: 
     if len(something[1]) >= 3: 
      do(x) 
     else: 
      do(y) 
    except IndexError: 
     print('{} does not have two items'.format(something)) 
0

Я согласен с @Loupy о вашей проблеме, но если вы уверены, что он существует, и питон говорит что его нет, так как мы можем помочь вам? Вы должны решить свои «недовольства» с помощью python и доверять python.

Также я вижу в коде еще одна проблема:

while i < int(length_hits) - 1: 
  • функция len всегда возвращает целые числа только, поэтому явное приведение ненужным
  • выражение int(length_hits) - 1 может быть отрицательным (в случае list является Emty), так теоретически вы можете попасть в бесконечный цикл (i = -2 вызовет бесконечный цикл).

IMO должно быть:

while len(all_hits): 
    do_staff() 

EDIT

У меня нет репутации, чтобы добавить комментарий на Бурхан Халид ответ, но я Уолд не рекомендую использовать for на последовательности, во время исполнения. Это плохая практика.

Смежные вопросы