Ето моя код:
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 два пъти (и вие получавате изключение за втори път, защото той не е там, след като го премахнете за първи път!)