Python Änderung falscher Liste?

Ich versuche, eine Liste von Primzahlen mit dieser Methode zu generieren. Ich muss jede Nummer 2 durchschleifen … n und check es für Vielfache von 2 … n. Aus irgendeinem Grund scheint sich die falsche Liste zu ändern.

import sys import argparse import math parser = argparse.ArgumentParser(description='find the largest prime factor of a number') parser.add_argument('n', type=int, help='number') args = parser.parse_args() sieve = [] for i in range(2,args.n+1): sieve.append(i) # tried int(i) copy1 = sieve # tried making extra copies. . . copy2 = sieve copy3 = sieve #print int(math.sqrt(args.n)) for index, i in enumerate(copy1): #print index, i for ii in copy2: #print ii if i % ii == 0: sieve[index]= None print sieve 

Ich bekomme folgende Fehlermeldung:

 Traceback (most recent call last): File "3.py", line 22, in <module> if i % ii == 0: TypeError: unsupported operand type(s) for %: 'int' and 'str' 

5 Solutions collect form web for “Python Änderung falscher Liste?”

Du machst keine Kopien. Sie verwenden Referenzen, so dass copy1 , copy2 und copy3 alle beziehen sich auf die gleiche Liste – sieve . Wenn Sie kopieren möchten, verwenden Sie:

 copy1 = sieve[:] 

Die eine Kopie des sieve erstellen und zu copy1 .

Sie müssen verwenden

 copy1 = sieve[:] # tried making extra copies. . . copy2 = sieve[:] copy3 = sieve[:] 

Um die Liste tatsächlich zu kopieren. Andernfalls kopieren Sie einfach den Verweis auf die Liste.

 >>> a = [1,2] >>> b = a >>> c = a[:] >>> b[0] = 0 >>> c[0] = 3 >>> a [0, 2] >>> b [0, 2] >>> c [3, 2] 
 copy1 = sieve copy2 = sieve copy3 = sieve 

Dies sind keine Kopien, die sie beziehen.

 primes = [2,3,5,7] def is_prime(n): if n in primes: return True for item in primes: if n % item == 0: return False return True assert is_prime(4) == False assert is_prime(29) == True assert is_prime(65) == False 

Ist eine gute Siebmethode

Mehr Unit-Tests, weil es Spaß macht

 true_primes = [int(item) for item in '11,13,17,19,23,29,31,37,41,43,47'.split(',')] for item in xrange(10, 50): if is_prime(item) == True: assert item in true_primes else: assert item not in true_primes 

Python hat Referenzsemantik. Im Allgemeinen bedeutet a = b dass der Name a auf denselben Wert verweist, auf den sich der Name b aktuell bezieht. Es wird kein neuer Wert erstellt oder gespeichert.

Du kannst eine Liste mit dem [:] Trick klonen, der erwähnt wurde. Eine allgemeinere Lösung für das Kopieren von Sachen ist, das Kopiermodul zu verwenden.

Allerdings erfordert gute Python-Code in der Regel nicht explizit kopieren Dinge sehr oft. Sie sollten sich mit dem Verständnis von Listen vertraut machen, um "modifizierte Versionen" bestehender Sequenzen zu erstellen. Zum Beispiel können wir das Sieb umbauen (auch einige andere Dinge zeigen):

 import sys, argparse, math, itertools parser = argparse.ArgumentParser(description='find the largest prime factor of a number') parser.add_argument('n', type=int, help='number') args = parser.parse_args() # Using a loop over a 'range' to fill a list with increasing values is silly, because # the range *is* a list of increasing values - that's how the 'for i in ...' bit works. sieve = range(2, args.n + 1) # We don't need to remember the original loop at all. # Instead, we rely on each iteration of the sieve putting a new prime at the beginning. for index in itertools.count(): # Counting upward, if index >= len(sieve): break # until we run out of elements, prime = sieve[index] # we grab the next prime from the list, sieve = [x for x in sieve if x == prime or x % prime != 0] # and sieve the list with it. # Of course, we can optimize that by checking that prime < sqrt(args.n), or whatever. print sieve 

Ich konnte das nicht testen, denn ich habe keine Kopie von Python 3.2 ( argparse ist neu in Python 3.2), aber zwei offensichtliche Dinge kommen in den Sinn:

Zuerst musst du sieve.append(int(i)) .

Zweitens, du machst keine Kopie von Sieb, du schaffst einfach einen neuen Verweis auf dieselbe Liste. Um eine Kopie zu machen, musst du

 copy1 = sieve[:] 
  • Entfernen von Nicht-Primzahlen aus der Liste
  • Circular Prime Zahlen Falsches Ausgabe-Python-Programm
  • Um die ersten N Primzahlen in Python zu finden
  • Iterate alle coprime Paare mit konstantem Raum?
  • Schnellste - Weg der Weltraum-Weg, um Primzahlen mit Python zu finden
  • Schnellste Weg, um alle Primzahlen unter N aufzulisten
  • Die primäre Wahrscheinlichkeit der wahren wahren Primzahlen
  • Python Prime Number Checker [Duplikat]
  • Berechnen Sie alle möglichen Faktoren einer Primzahl
  • Python Eratosthenes Sieb-Algorithmus-Optimierung
  • Ist das ein optimaler Generator?
  • Python ist die beste Programmiersprache der Welt.