/ / ValueError v pythone. - python, pripraví

ValueError v pytone. - python, primes

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ď č. 1

Pozrime 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í!)