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
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 ...

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:
nachher (für N=5):
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.