Tu je môj kód:
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)
Mám túto chybu:
File "primes.py", line 12, in <module>
primes.remove(x);
ValueError: list.remove(x): x not in list
Ale zábavná vec je, keď píšem takto:
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)
Prečo? a ako to môžem opraviť?
odpovede:
0 pre odpoveď č. 1Pozrime sa na výsledok:
>>> primes = filter(f , range (6,50))
>>> primes
[7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49]
Máte tu hodnotu 35, čo je 5 * 7. Vo vašej vnorenej slučke, keď a
je 5, podmienka je splnená a 35 je odstránených zo zoznamu primes
; kedy a
prejde do 7, podmienka je opäť splnená, ale tentoraz 35 je už odstránené, takže je zvýšená výnimka.
Takže jednoduchý fix je taký, aký je uvedený nižšie. takýmto spôsobom x
je odstránená iba raz pri prvom splnení podmienky:
for x in primes:
for a in filter(f, range(2,x-1)):
if x%a == 0:
primes.remove(x)
break
Teraz však tento prvok preskočí hneď za prvočíselným číslom, napríklad 95 v tomto zozname:
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]
ktorý sa stanoví tak, že sa vytvorí kúsok primes
:
for x in primes[:]:
for a in filter(f, range(2,x-1)):
if x%a == 0:
primes.remove(x)
break
1 pre odpoveď č. 2
Uveďte do niektorých tlačových vyhlásení, čo sa deje:
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
Takže váš problém je, že ste "vyprodukujete číslo 35 dvakrát (a dostanete výnimku druhýkrát, pretože to tam nie je po prvom odstránení!)