Seite 1 von 1

Listenfunktionen und Variablen

Verfasst: Freitag 15. Mai 2009, 16:39
von pyMarkus
Hallo Leute,
Bin grad dabei anzufangen ein Primzahlprogramm zu schreiben. Allerdings scheitert mein Vorhaben an einer ganz subtilen Frage. Erstmal der Code:

Code: Alles auswählen

for i in range(2, N):
   for k in range(2, N):
       produkt = i*k
       loesung.remove(produkt)
Der Code an sich spielt erstmal keine Rolle. Ist nur mit dabei um zu verstehen worum es geht. Aber es kommt jetzt die Fehlermeldung, dass das "produkt" nicht in der Liste ist. Wie löse ich das Problem?
Wenn wir schon beim Thema sind, gibt es eine Möglichkeit

Code: Alles auswählen

for i in range(2, N):
    loesung.append(i)
Auch so zu schreiben, dass die for Zeile in den Klammern des loesung.append() steht?

Grüße und Danke
Markus

Verfasst: Freitag 15. Mai 2009, 16:50
von numerix
ad 1: Du kannst nur etwas entfernen, was in der Liste ist.
Entweder löst du das über eine entsprechende exception oder prüfst vorher mit dem in-Operator, ob das, was du entfernen willst, auch drin ist.

ad 2: Was du suchst, nennt sich "list comprehension". Such mal danach.

ad 0: Ich hoffe mal, die geschachtelte Schleife steht in keinem Zusammenhang zu deinem Primzahlprogramm ... :wink:

Verfasst: Freitag 15. Mai 2009, 17:01
von pyMarkus
Wenn ich produkt die Zahl 3 zuweiße kommt immernoch die Fehlermeldung das "produkt" nicht in der Liste ist. Ich schätze meine Syntax hat hier einen Fehler.

Verfasst: Freitag 15. Mai 2009, 17:08
von numerix
pyMarkus hat geschrieben:Wenn ich produkt die Zahl 3 zuweiße kommt immernoch die Fehlermeldung das "produkt" nicht in der Liste ist. Ich schätze meine Syntax hat hier einen Fehler.

Code: Alles auswählen

>>> zahlen = range(20)
>>> zahlen
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> zahlen.remove(3)
>>> zahlen
[0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> zahlen.remove(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

Verfasst: Freitag 15. Mai 2009, 17:10
von pyMarkus
Das ist mir klar, aber wenn ich

Code: Alles auswählen

loesung.append(list(range(2, N)))
produkt = 3
loesung.remove(produkt)
verwende, funktioniert das nicht.

Verfasst: Freitag 15. Mai 2009, 17:12
von pcos
Hallo,

wie sieht Produkt aus, bevor die Schleife startet? Wahrscheinlich alle Zahlen von 2 bis N-1, s. Dein 2. Code-Fragment. In Deiner Schleife wird aber (wenn N>2) versucht, bestimmte Zahlen mehrfach (!) aus der Liste zu entfernen, z.B. ist 6==2*3 und 6==3*2. Das gibt dann beim 2. Versuch einen Fehler...

Verfasst: Freitag 15. Mai 2009, 17:15
von pcos
Hi,

meine letzte Antwort bezog sich hierauf:

Code: Alles auswählen

loesung.append(list(range(2, N)))
produkt = 3
loesung.remove(produkt)
Du hängst eine Liste an loesung an, also z.B.
vorher:

Code: Alles auswählen

loesung =[4,5,6]
nachher (für N=5):

Code: Alles auswählen

loesung =[4,5,6,[2,3,4]]
Also geht remove(3) nicht (falls 3 nicht vorher schon in loesung war)

Jetzt zu Deinem letzten Beitrag:

Wenn loesung = [2,3,4,5,6,7,8,9], dann funktioniert loesung.remove(3) natürlich. Aber nur ein einziges Mal, weil 3 genau ein Mal vorkommt. Siehe dazu meinen ersten Beitrag.


:?: EDIT: Ich stehe gerade auch auf dem Schlauch... Ich habe diesen Beitrag geschrieben, nachdem pyMarkus seinen Antwort von 17:18 geschrieben hat, die jetzt unter diesem Beitrag steht...

Verfasst: Freitag 15. Mai 2009, 17:18
von pyMarkus
loesung enthält 2,3,4,5,6,7,8,9
dann weiße ich produkt 3 zu
dann will ich "produkt" also 3 entfernen, geht aber nicht

Ich glaub ich steh grad aufm Schlauch

Edit: Habs jetzt glaub verstanden... Ich teste heute Abend mal noch und werde morgen mal mein Ergebnis zu diesem Thema präsentieren

Verfasst: Freitag 15. Mai 2009, 17:30
von numerix
pyMarkus hat geschrieben:loesung enthält 2,3,4,5,6,7,8,9
dann weiße ich produkt 3 zu
dann will ich "produkt" also 3 entfernen, geht aber nicht

Ich glaub ich steh grad aufm Schlauch
Mensch, nutz doch mal den interaktiven Modus von Python und sieh dir an, was du da hast/machst!

Code: Alles auswählen

>>> zahlen = range(10)
>>> zahlen.append(range(11,15))
>>> zahlen
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, [11, 12, 13, 14]]
Du solltest erstmal das Python-Tutorial durchgehen, bevor du dich an Primzahlen machst. Ein remove() im Primzahlprogramm ist ohnehin keine gute Idee.

Verfasst: Samstag 16. Mai 2009, 18:12
von Rebecca
pyMarkus, lass dir doch einfach in jedem Schritt mal die Liste und das Produkt ausgeben, dann solltest du sehr schnell sehen, was da passiert.