Zahlenreihen

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.
python_tipper
User
Beiträge: 17
Registriert: Mittwoch 6. November 2019, 19:24

Nachdem ich mich dumm und dämlich studiert habe, stelle ich die Frage nun hier im Forum.

Ich möchte drei Zahlenreihen generieren mit einer while/for Schlaufe:

6 11 16
7 12 17
8 13 18
9 14 19
10 15 20

Mir ist klar wie man einzelne Zahlen erhöhen kann. Aber nicht alle Reihen... Beispiel:

Code: Alles auswählen

z1 = 5
z2 = 10
z3 = 15

while z1 <= 9:

    z1 += 1

    print(z1, z2, z3) 
Ergibt dann:
6 10 15
7 10 15
8 10 15
9 10 15
10 10 15

Wie muss ich die Schlaufe aufbauen, damit ALLE drei Zahlenreihen erhöht werden?
Nicht so:

Code: Alles auswählen

z1 = 5
z2 = 10
z3 = 15

while z1 <= 9:

    z1 += 1
    z2 += 1

    print(z1, z2, z3) 
denn das ergibt:
6 11 15
7 12 15
8 13 15
9 14 15
10 15 15


Und um es noch komplizierter zu machen: Ich möchte ALLE möglichen Varianten/Kombinationen ausgeben...

Also als Beispiel die erste Zahl "6" soll zusammen mit 10/11/12/13/14 und 15/16/17/18/19 erscheinen, ein ganzer Zahlenwurm, in allen Varianten...

Ist das machbar ohne extrem kompliziertes Konstrukt?

Vielen Dank
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum nicht so? Du mußt natürlich auch noch ›z3‹ ändern.
Aber Zahlenreihen generiert man nicht so, sondern benutzt ›range‹:

Code: Alles auswählen

for z1, z2, z3 in zip(range(6,11), range(11,16), range(16, 21)):
    print(z1, z2, z3)
Und wenn man alle Kombinationen will, benutzt man ›itertools.product‹.
python_tipper
User
Beiträge: 17
Registriert: Mittwoch 6. November 2019, 19:24

Danke.

Zählt aber auch nur die Reihen hoch...

Code: Alles auswählen

z1 = 5
z2 = 11
z3 = 16

for z1, z2, z3 in zip(range(6,11), range(11,16), range(16, 21)):
    print(z1, z2, z3)
6 11 16
7 12 17
8 13 18
9 14 19
10 15 20

Möchte aber auch alle Varianten ausgeben...

Also in Zeile 1:

6 11 16 - 6 12 16 - 6 13 16 - bis 6 15 -20

Hoffe ich drücke mich einigermassen verständlich aus...

Ziel ist schlussendlich ein riesiger Zahlenwurm...
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du auch meinen letzten Satz gelesen?
python_tipper
User
Beiträge: 17
Registriert: Mittwoch 6. November 2019, 19:24

Ja, ich kämpfe grade mit der Syntax von itertools...
python_tipper
User
Beiträge: 17
Registriert: Mittwoch 6. November 2019, 19:24

Bin nun am Bahnhof...

Code: Alles auswählen

from itertools import product

z1 = 5
z2 = 11
z3 = 16

for z1, z2, z3 in zip(range(6,10), range(11,15), range(16, 20)):
    print(z1,z2,z3)

product(z1,z2,z3)
for alle in product(z1,z2,z3):
    print(alle)
Ergibt:
6 11 16
7 12 17
8 13 18
9 14 19
Traceback (most recent call last):
File "**** line 10, in <module>
product(z1,z2,z3)
TypeError: 'int' object is not iterable

Oben macht er das mit range, soweit okay. Aber was mach ich unten falsch?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Die ersten Zuweisungen an z1-3 sind überflüssig, weil die Werte in der for-Schleife gleich ersetzt werden. Und ›product‹ braucht keine Zahlen, sondern die Zahlenreihen, damit es weiß, welcher Kombinationen es bilden soll. Einfach nur ›product‹ aufzurufen ist auch überflüssig, weil es nur bei der for-Schleife Sinn ergibt.

Code: Alles auswählen

from itertools import product

for z1, z2, z3 in zip(range(6,10), range(11,15), range(16, 20)):
    print(z1,z2,z3)

for alle in product(range(6,10), range(11,15), range(16, 20)):
    print(alle)
python_tipper
User
Beiträge: 17
Registriert: Mittwoch 6. November 2019, 19:24

sehr cool, genau so wollte ich das. vielen dank!

kann man die ausgabe auch direkt formatieren? ohne klammern und kommas?

(9, 14, 19) -> 9 14 19
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Mit was lernst Du Python?
python_tipper
User
Beiträge: 17
Registriert: Mittwoch 6. November 2019, 19:24

benutze eclipse und nebenbei noch pythonista auf einem ipad, um mal schnell eine idee auszuprobieren.
lernen mit googeln bei konkreten fragestellungen (was mir aber hier nicht weitergeholfen hatte, ein forum ist da sicher der bessere weg).
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Schreib halt wieder "z1, z2, z3" anstatt "alle"...
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann solltest Du mal ein Tutorial, zum Beispiel das in der offiziellen Dokumentation, durcharbeiten. Insbesondere zu Grunddatentypen wie Tuple.
python_tipper
User
Beiträge: 17
Registriert: Mittwoch 6. November 2019, 19:24

danke für die tipps. ich glaube ich wählte einen komplett falschen ansatz.

erkenntniss: die listen muss ich gar nicht erstellen.

ich erklär mal genauer was ich erreichen will:

ich habe zwei zahlenpäärchen, zb. koordinaten: 100 200 und 500 600.

Code: Alles auswählen

z1a = 100
z1b = 200

z2a = 500
z2b = 600
diese möchte ich miteinander vergleichen. und immer wenn der abstand zb. 200 ist, soll dieser wert ausgegeben werden.

vergleichen heisst: alle zahlen von 100-150/200-250 und 500-550/600-650 sollen vergleichen werden. also wie meine ursprüngliche frage, sie sollen heraufgezählt werden. jede der vier zahlen bis zum maximalen wert.

abstand berechnen:

Code: Alles auswählen

abstand=math.sqrt((((z1-z3)**2)+((z2-z4)**2)))
vergleichen mit:

Code: Alles auswählen

    if abstand==200:
        print(abstand, z1, z2, z3, z4) 
dann sollen ALLE zahlen die den berechneten abstand "200" haben, ausgegeben werden. mein skript stoppt hier noch nach der ersten ausgabe.

wie bekomme ich das alles hin? habe nun fast das ganze wochenende verbraten und komme auf keinen grünen zweig. vielleicht mag mir jemand aufzeigen, wo ich das falsch mache?

herzlichen dank :-)
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hat denn nun z1a/b mit z1 bis z4 zu tun? Was meinst Du mit „allen Zahlen”? Hast Du das Problem mal auf Papier mit Lineal und Zirkel gelöst?

Bisher sehe ich noch kein Skript.
Benutzeravatar
__blackjack__
User
Beiträge: 14050
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was ist denn das *eigentliche* Problem das gelöst werden soll? Also mal nicht als (halbe) Lösung formuliert, sondern mal tatsächlich das Problem und die Motivation hinter dem ganzen?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
python_tipper
User
Beiträge: 17
Registriert: Mittwoch 6. November 2019, 19:24

doppelpost
doppelpost
Zuletzt geändert von python_tipper am Sonntag 10. November 2019, 19:25, insgesamt 1-mal geändert.
python_tipper
User
Beiträge: 17
Registriert: Mittwoch 6. November 2019, 19:24

doppelpost
doppelpost
Zuletzt geändert von python_tipper am Sonntag 10. November 2019, 19:26, insgesamt 1-mal geändert.
python_tipper
User
Beiträge: 17
Registriert: Mittwoch 6. November 2019, 19:24

...habe aus z1/z2 neu z1a und z1b gemacht, weil die "zusammengehören"... ja habe es auch aufgezeichnet, da gibt es sehr viele mögliche lösungen.

alle zahlen heisst: z1a ist definiert von 100-150, z1b von 200 bis 250 etc.
somit vergleichen:

Code: Alles auswählen

100 200 500 600
101 200 500 600
...
150 250 550 650
skript kein ansatz mehr vorhanden, alle meine absurden schleifen und ifs und fors laufen ins leere :-(

wie macht man sowas konkret?

das eigentliche problem (frage von blackjack): ich möchte alle möglichen koordinaten-paare/kombinationen, welche als bedingung den abstand x erfüllen, auslesen.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum möchtest Du gerade die ganzen Zahlen zwischen 100 und 150? Was ist der Hintergrund?
Woher kommen die Zahlen? Was willst Du mit dem Ergebnis anfangen?
python_tipper
User
Beiträge: 17
Registriert: Mittwoch 6. November 2019, 19:24

@sirius3: ich möchte alle möglichen koordinaten-paare/kombinationen, welche als bedingung den abstand x erfüllen, auslesen.
Antworten