ValueError в Python. - питон, примеси

Ето моя код:

def f(x): return x%2!=0 and x%3!=0

primes = filter(f , range (6,50))

for x in primes:
for a in filter(f, range(2,x-1)):
if x%a == 0:
primes.remove(x);

print(primes)

Получавам тази грешка:

File "primes.py", line 12, in <module>
primes.remove(x);
ValueError: list.remove(x): x not in list

Но смешно е да пиша така:

def f(x): return x%2!=0 and x%3
primes = filter(f , range (6,20))

for x in primes:
for a in filter(f, range(2,x-1)):

if x%a == 0:
primes.remove(x);

print(primes)

Защо? и как мога да го оправя?

Отговори:

0 за отговор № 1

Нека да разгледаме резултата:

>>> primes = filter(f , range (6,50))
>>> primes
[7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49]

Тук имате стойността 35, която е 5 * 7. Във вложения ви цикъл, кога a е 5, условието е изпълнено и 35 е премахнато от списъка с primes; кога a отива на 7, условието е изпълнено отново, но този път 35 вече е премахнато, така че се прави изключение.

Така че един прост фиксиран е като този по-долу. така че x се премахва само веднъж, когато първото условие е изпълнено:

for x in primes:
for a in filter(f, range(2,x-1)):
if x%a == 0:
primes.remove(x)
break

Но сега тя ще пропусне елемента точно след не-prime номер, като 95 в този списък:

primes=[7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49, 53, 55, 59, 61, 65, 67, 71, 73, 77, 79, 83, 85, 89, 91, 95, 97]

който се фиксира, като се направи парче от primes:

for x in primes[:]:
for a in filter(f, range(2,x-1)):
if x%a == 0:
primes.remove(x)
break

1 за отговор № 2

Нека да поставим някои изявления за печат, за да видим какво се случва:

In [81]: %paste
def f(x): return x%2!=0 and x%3!=0

primes = filter(f , range (6,50))
print primes

for x in primes:
for a in filter(f, range(2,x-1)):
if x%a == 0:
print x
primes.remove(x);

print(primes)

## -- End pasted text --
[7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49]
25
35
35

Така че проблемът ви е, че издавате номер 35 два пъти (и вие получавате изключение за втори път, защото той не е там, след като го премахнете за първи път!)