Frage zu Tupeln und deren Inhalten

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.
Antworten
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

Hallo zusammen,
ich schreibe derzeit ein Programm, das die Anfangskoordinaten von einem Quader per Input Eingabe abfragt und in einem Tupel ablegt. Desweiteren frage ich die Länge, Breite Höhe, des Quaders ab und lege diese Werte ebenfalls in einem Tupel ab!
Das Programm soll nun die Eckpunktkoordinaten in einer Liste zurückgeben.
Leider weiß ich nicht so recht, wie ich jetzt mit meinen Tupeln umgehen soll, damit ich damit die jeweiligen Rechenoperationen durchführen kann.

Beispielsweise: Anfangskoordinaten = (3 , 2 , 1) und Eckpunktkoordinaten: (5 , 4 , 5)
Wie stelle ich es an, die Eckpunktdaten nun auf das Anfangstupel "anzuwenden" und die Ergebnisse in eine Liste abzulegen?! :?:

Ich weiß:

eckpunkt1 = anfangskoordinaten[0]+laenge[0] Würde hier der Wert 8 rauskommen. Aber weiter weiß ich auch nicht mehr.

Code: Alles auswählen

def quader():

    koord = [ ]
    lbh = [ ]
    eckpunkte = [ ]
        
    x = int(input('Koordinate x eingeben: ')) 
    y = int(input('Koordinate y eingeben: ')) 
    z = int(input('Koordinate z eingeben: '))
    koord.append(x)
    koord.append(y)
    koord.append(z)
    anfangskoordinaten = tuple(koord)
    print(anfangskoordinaten)
    
    l = int(input('Länge x eingeben: '))
    b = int(input('Breite y eingeben: '))
    h = int(input('Höhe z eingeben: '))
    lbh.append(l)
    lbh.append(b)
    lbh.append(h)
    laenge = tuple(lbh)

    print(laenge)
georgebaker
User
Beiträge: 25
Registriert: Freitag 12. April 2013, 19:53

Für Rechenoperationen mit Listen würde sich numpy anbieten. Damit geht es ziemlich einfach:

Code: Alles auswählen

>>> import numpy as np
>>> a = np.array([3,2,1])
>>> b = np.array([5,4,5])
>>> a+b
array([8, 6, 6])
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

Danke für deine Antwort. Ich habe jedoch Tupel und möchte die Koordinaten dann darauf addieren und das Ergebnis in einer Liste speichern.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@duodiscus: Dein Ansatz

Code: Alles auswählen

eckpunkt1 = anfangskoordinaten[0]+laenge[0] 
ist ja schon der richtige, du brauchst nur alle Kombinationen durchgehen:

Code: Alles auswählen

eckpunkte = [tuple(a+b*c for a,b,c in zip(anfangskoordinaten,laenge,z)) for z in itertools.product(*[[0,1]]*len(laenge)]
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

@Sirius3:

Leider verstehe ich deine Codezeile überhaupt nicht, da ich viele der angewendeten Sachen nicht kenne z.b. zip und itertools etc.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dan probiere die Einzelteile einfach mal im interaktiven Interpreter aus, dafür ist er da. Da die Teilausdrücke teilweise Generaturen liefern (können), musst du diese unter Umständen noch mit einem list-Aufruf auswerten:

Code: Alles auswählen

list(itertools.product(...))
Als erstes solltest du aber zunächst nachlesen was List Comprehensions sind und wie diese funktionieren.
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@duodiscus: ich habe ja auch keine Lust, fremde Hausaufgaben zu erledigen. Deshalb ja auch mein Hinweis, dass das Addieren der einzelnen Elemente von anfangskoordinaten und laenge schon der richtige Ansatz ist; wenn Du das jetzt für alle möglichen Kombinationen tust hast Du alle Eckkoordinaten und nichts anderes macht meine Lösung.
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

Das kann ich ja auch wohl nachvollziehen das du da keine Lust drauf hast.
Nur mein Problem ist halt, das wenn ich das so zusammenrechne:

Code: Alles auswählen

eckpunkt1 = anfangskoordinaten[0]+laenge[0]
da dann genau ein wert abgelegt wird. Ich brauche aber auch die beiden anderen Koordinaten. die ich am besten als tupel in eine liste ablege.
BlackJack

@duodiscus: Na dann mach das doch. Wenn Du nichts verwenden willst was Du nicht im Unterricht hattest, läuft es auf alle 8 Rechnungen explizit hinschreiben hinaus. Nervige Fleissarbeit, aber einfacher geht es halt ohne andere Hilftsmittel nicht.

Bei der Gelegenheit: Die Listen in Deinem Quelltext sind überflüssig. Denn Du hast ja eine Feste Anzahl von Werten an explizite Namen gebunden. Da jetzt eine leere Liste zu erstellen, um die Werte dann *einzeln* mit `append()` in diese Liste zu tun, nur um *die* dann in ein Tupel zu wandeln, ist sehr umständlich. Alleine das erstellen einer leeren Liste um da dann eine feste Anzahl von bekannten Werten anzuhängen ist schon umständlich.

Code: Alles auswählen

    # 
    # anstatt...
    # 
    koord = [ ]
    x = int(input('Koordinate x eingeben: '))
    y = int(input('Koordinate y eingeben: '))
    z = int(input('Koordinate z eingeben: '))
    koord.append(x)
    koord.append(y)
    koord.append(z)
    anfangskoordinaten = tuple(koord)

    #
    # ... weniger umständlich
    # 
    x = int(input('Koordinate x eingeben: '))
    y = int(input('Koordinate y eingeben: '))
    z = int(input('Koordinate z eingeben: '))
    anfangskoordinaten = (x, y, z)
Der Name `laenge` für etwas was Länge, Breite, und Höhe enthält ist ungünstig bis falsch. `abmessungen` wäre vielleicht ein guter Name.

Für das berechnen der acht Eckpunkte würde man die einzelnen Werte aber besser wieder aus den Tupeln holen wenn man die Rechnungen alle hinschreiben will und an sprechende bezeichner binden, denn ``x + laenge`` sagt dem Leser mehr als ``anfangskoordinaten[0] + abmessungen[0]``.

Und die Eckpunkte bitte nicht wieder an Namen binden und an eine Liste mit `append()` anhängen, sondern gleich eine Liste mit den Punkten, beziehungsweise deren Berechnung erstellen. Wie bei dem Tupel oben.
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

Danke für deine Hilfe, vorallem mit dem einfacheren erstellen der Tupel ohne über die Listen zu gehen. Ja, ich möchte es ja auch gerne sozusagen mühselig zusammenrechnen, allerdings klappt das nicht so recht. Denn ich habe es folgendermaßen versucht:

Code: Alles auswählen

ecke1 = [anfangskoordinaten[i] + abmessungen[i] for i in range(3)]
Da gibt er mir den ersten Eckpunkt als Ergebnis.

So jetzt will ich weiter machen mit einem zweiten Eckpunkt:

Code: Alles auswählen

ecke1 = [anfangskoordinaten[i:0] + abmessungen[i:0] for i in range(3)]
Er soll also nur den ersten Wert des Tupel addieren, und den Rest so belassen. Da kommt aber nur Müll raus. Vielleicht geht es ja auch ohne for Schleife viel einfacher. Nur wie kriege ich das hin, das er mir nicht nur den berechneten Wert zurückgibt sondern den Rest auch?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@duodiscus: mir raten kommst Du beim Programmieren nicht weit. Was soll denn [i:0] sein? Du kannst statt der for-Schleife die drei Terme ausschreiben, so wie Blackjack das mit (x, y, z) gemacht hat, aber halt mit Deinen Rechnungen statt x,y,z.
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

Danke, ich habe das Programm nun fertigstellen können und bin nun wieder ein ganzes Stück weiter im Verständnis und Umgang mit Python. Wirklich gut, das es dieses Forum gibt!
Antworten