vorhandene Tupel werden nicht übernommen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 10. Juli 2008, 14:07

Daniela hat geschrieben:Vielen Dank dafür, dass du dir solche Gedanken gemacht hast um mein Problem.


Sowas hält den Geist fit ...

Daniela hat geschrieben:Nur versteh ich nicht so richtig den Quellcode.


Da abwechselnd mit beiden Listen immer das gleiche gemacht wird - nämlich jeweils die beiden nächsten Punkte an die endgültige Liste anzuhängen - habe ich eine Liste "liste" genommen, in die ich die beiden Teillisten packe. Die Boolsche Variable erste_liste sorgt nun durch den alternierenden Wert dafür, dass jeweils abwechselnd eine der beiden Listen mit den Punkten ausgewählt wird. Das unäre "+" sorgt dafür, dass aus dem boolschen Wert eine 0 oder 1 gemacht wird als Index für "liste". Wie ich eben festgestellt habe, ist das verzichtbar - geht auch ohne.

Das Löschen der jeweils an die Endliste angehängten Punkte aus den beiden Teillisten wäre natürlich verzichtbar, hat aber m.E. den Vorteil, dass man auf diese Weise die beiden Teillisten nicht mit einem mitzuführenden Index durchlaufen muss, sondern einfach immer die ersten beiden Punkte nimmt.

Je nachdem, ob die Anzahl der Punkte in den Listen gerade oder ungerade ist, verläuft der letzte Zug von P3 nach P4 oder eben andersherum. Am Ende befindet sich also in der noch nicht leeren Liste nur noch 1 Punkt (statt zweien), der als letzter Punkt anzuhängen ist.

Und während ich das gerade aufschreibe, fällt mir auf, dass die Geschichte mit dem p_anz überflüssig ist. Die Zeile "p_anz = ..." kann weg, in den folgenden Zeilen kann p_anz einfach durch den Wert 2 ersetzt werden.

Etwas "geglättet" nun also so:

Code: Alles auswählen

# Pseudopunkte erzeugen
liste_P1P3 = ["P1P3-%02i" %i for i in xrange(7)]
liste_P2P4 = ["P2P4-%02i" %i for i in xrange(7)]
# Listen zusammenfuehren
listen = [liste_P1P3,liste_P2P4]
liste_komplett = [liste_P1P3.pop(0)]
erste_liste = False
while True:
    erste_liste = not erste_liste
    liste = listen[erste_liste]
    liste_komplett.extend(liste[:2])
    del(liste[:2])
    if not liste:
        liste_komplett.extend(listen[not erste_liste])
        break
# Pseudopunkte ausgeben
for punkt in liste_komplett:
    print punkt
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Beitragvon Daniela » Donnerstag 10. Juli 2008, 14:34

numerix hat geschrieben:
Daniela hat geschrieben:Vielen Dank dafür, dass du dir solche Gedanken gemacht hast um mein Problem.


Sowas hält den Geist fit ...


Na dann. Ist doch schön wenn man dabei helfen kann, das keine Gehirnzellen ungenutzt bleiben. ;-)

Das was ich angemerkt hatte wegen einem Rückgabewert, kann ignoriert werden, da ich es bei mir an die falsche Stelle geschrieben hatte. (zu sehr eingerückt).

Daniela
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 10. Juli 2008, 15:26

Jetzt weiß ich, dass mein ungutes Gefühl über die Qualität meines Codes berechtigt war. So gefällt es mir besser:

Code: Alles auswählen

# Pseudopunkte erzeugen
liste_P1P3 = ["P1P3-%02i" %i for i in xrange(6)]
liste_P2P4 = ["P2P4-%02i" %i for i in xrange(6)]
# Listen zusammenfuehren
liste_komplett = [liste_P1P3.pop(0)]
for k in xrange(0,len(liste_P2P4),2):
    liste_komplett.extend(liste_P2P4[k:k+2]+liste_P1P3[k:k+2])
# Pseudopunkte ausgeben
for punkt in liste_komplett:
    print punkt
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Beitragvon Daniela » Donnerstag 10. Juli 2008, 15:37

Darf man fragen, weswegen du denn ein ungutes Gefühl hattest?

Die while-schleife wurde nun durch eine for-schleife ersetzt. dabei wird dann mit dem Index 0 angefangen, solange, bis die länge von der 2. Liste erreicht ist. Und die Schrittweite beterägt 2.
Nun wird dann in jedem zählschritt aus der 2. Liste 2 Werte entnommen und dann 2 Werte aus der 1. Liste.

naja und zum Schluss dann die Ausgabe.

Hierbei werden bei dem Code, die schon bearbeiteten Tupel in der Liste nicht gelöscht, da durch einen "zählparameter" (k) wird der Index mit jedem Durchgang hochgezählt und somit weiss man auch, an welcher stelle man in der Liste ist.

Richtig???
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 10. Juli 2008, 15:49

Daniela hat geschrieben:Darf man fragen, weswegen du denn ein ungutes Gefühl hattest?


Weil ich 11 Zeilen nicht gerade eleganten Code benötigt habe und es mir einfach zu kompliziert erschien.
Das hat sich dann ja auch bewahrheitet, denn das Gleiche gelingt nun mit 3 relativ transparenten Zeilen Code.
Daniela
User
Beiträge: 73
Registriert: Donnerstag 19. Juni 2008, 07:32

Beitragvon Daniela » Donnerstag 10. Juli 2008, 15:53

Ja, das ist ein Argument.

Aber bekanntlich führen ja viele Wege nach Rom. ;-)

Find ich trotzdem toll, dass du dir sooo viel Gedanken um mein Problem gemacht hast.

Danke nochmal

Daniela

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]