Использование Python Modulo Operator для сортировки списка - PullRequest
1 голос
/ 01 июля 2011

Я работал над проблемами Project Euler, чтобы попытаться изучить python, и я написал решение второй проблемы (найдите сумму четных членов в последовательности Фибоначчи, которые не превышают четырех миллионов). Код дает мне правильное решение, но он требует, чтобы я дважды использовал деление модуля, чтобы удалить нечетные значения из списка сгенерированных мной чисел Фибоначчи. Вот решение, которое я написал:

term_1 = 1
term_2 = 2
fibonacci_list = [1]
while term_2 < 4000000:
    fibonacci_list.append(term_2)
    term_1, term_2 = term_2, term_1 + term_2
for num in fibonacci_list:
    if num % 2 != 0
        fibonacci_list.remove(num)
for num in fibonacci_list:
    if num % 2 != 0
        fibonacci_list.remove(num)
return sum(fibonacci_list)

Если я добавлю только один цикл for, список fibonacci_list станет следующим:

[2, 5, 8, 21, 34, 89, 144, 377, 610, 1597, 2584, 6765, 10946, 28657, 46368, 121393, 196418, 514229, 832040, 2178309, 3524578]

Не должны ли все нечетные термины пройти проверку на деление на модуль и быть удалены? Почему мне нужно дважды запустить цикл for, чтобы удалить все нечетные термины?

Ответы [ 5 ]

3 голосов
/ 01 июля 2011

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

См. здесь , здесь и здесь для предыдущих вопросов по этой же теме.

Ради обсуждения, давайте предположим, что это на самом деле проблема, и давайте предположим, что запрещено удалять элементы из списка, покаитерации по нему.

Что вы могли бы сделать по-другому, что бы вам не пришлось удалять элементы из списка во время итерации по нему?Я не уверен, хотите ли вы получить ответ прямо или нет, так как вы работаете с Project Euler, поэтому я не буду выдавать какие-либо очевидные ответы.

1 голос
/ 01 июля 2011

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

0 голосов
/ 02 декабря 2012

Это помнит меня сито из Эратосфена.Поэтому я хотел бы предложить это решение, которое предполагает преобразование вашего списка в array:

fibonacci_list = fibonacci_list [ fibonacci_list % 2 != 0  ]
0 голосов
/ 01 июля 2011

Сравните вашу программу с этим. Это может помочь.

fibonacci = [1,2]
num = 3
while num < 4000000:
    fibonacci.append(num)
    len_ = len(fibonacci)
    num = fibonacci[len_-2] + fibonacci[len_-1]

sum = 0
for num in fibonacci:
    if num%2 == 0: sum += num

print sum

Я не понимаю, почему вам не нужно удалять нечетные записи из списка. Просто добавьте четные, вот и все.

0 голосов
/ 01 июля 2011

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

В любом случае, вы попали в классическую ловушку изменения последовательности во время итерации по ней. Не делай этого, делай это:

fibonacci_list[:] = [x for x in fibonacci_list if x%2==0]
...