2013-02-20 2 views
0

Итак, у меня возникла действительно странная ошибка. У меня есть модуль, содержащий ten.pyиндекс индекса вне диапазона внутри для цикла по индексу 2

import math 

def go(): 
    list_ = list(range(3, 100000, 2)) 
    max_ = int(math.sqrt(len(list_))) 
    print(len(list_)) 
    print(max_) 
    for i in range(1,max_): 
     print(i) 
     current = list_[i] 
     for j in list_[i+1:]: 
      if j % i == 0: 
       list_.remove(j) 
go() 

Выход заключается в следующем:

49999 
223 
1 
2 
Traceback (most recent call last): 
    File "D:\Documents\KomodoProjects\Project Euler\ten.py", line 14, in <module> 
    go() 
    File "D:\Documents\KomodoProjects\Project Euler\ten.py", line 10, in go 
    current = list_[i] 
IndexError: list index out of range 

Как вы можете увидеть размер списка 49999 и цикл только идет до 223. Несмотря на все это ему уже дает исключение из диапазона вне индекса при индексе = 2!

Является ли list_ внутри цикла for каким-то образом не ссылкой на список_ внутри go()? Я понятия не имею, почему эта проблема возникает.

Зафиксировано изменение

for i in range(1,max_): 

к для г в list_:

+0

В traceback упоминается переменная 'current', но эта переменная не отображается в вашем заданном коде. Возможно, вам стоит опубликовать фактический код, который вы используете. – steveha

+0

О, извините, я удалил эту строку, но не обновил трассировку. Редактирование сейчас. –

+0

Также - для Euler в целом - вы можете найти это сообщение http://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python –

ответ

0

Вот ваша проблема:

У вас есть for цикл, который удаляет номера из list_. Он удаляет столько чисел, что list_ - это длина 2, а затем list_[2] сбой и вызывает исключение.

Причина, по которой он удаляет столько чисел, заключается в том, что вы вычисляете x % 1 == 0, что верно для любого значения x. Поскольку вы начинаете с позиции 2 в списке, вы удаляете все после этой позиции.

Я не уверен, что вы делаете, но это будет медленный способ сделать это, что бы это ни было. Это похоже на скрининг на простые числа ... вы можете захотеть выполнить поиск Google для «Python find prime numbers» или что-то еще.

+1

В частности, в 'i = 1', * any * значение' j' вернет 'true' для' j% i == 0' (1 делит равномерно на все). – Hannele

+0

О, ну, как-то внешний цикл заработал в 1. Предполагалось, что он даже не был диапазоном(), а просто list_. Это, должно быть, каким-то образом испортилось, когда я тестировал разные вещи. –

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