Liste 3x Wiederholen

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.
Sülo
User
Beiträge: 29
Registriert: Dienstag 4. Mai 2021, 09:58

Guten Tag liebe Programmierer!:)
Ich hab ein Problem:
Ich hab eine random Liste erstellt quasi wie beim Lotto 6 aus 49 nun will ich aber das mir das Programm die Liste 3x hintereinander ausgibt und darauf achtet, das die random zahlen nicht doppelt verwendet werden.

Folgendes habe ich schon geschrieben:

import random

Zahlen = []
x = 0
while x < 6:
Zahl = random.randint(1,49)
if Zahl in Zahlen:
continue
else:
Zahlen.append(Zahl)
x = x + 1
Zahlen.sort()
print(Zahlen)

ab jetzt komm ich nicht mehr weiter, wäre es doch sinnvoller auf eine for-schleife zu greifen?

danke schonmal im Voraus!
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Bitte benutze den "Code" Button, damit dein Programm lesbar bleibt :wink:
Sülo hat geschrieben: Montag 17. Januar 2022, 10:37 Folgendes habe ich schon geschrieben:

Code: Alles auswählen

import random

Zahlen = []
x = 0
while x < 6:
	Zahl = random.randint(1,49)
	if Zahl in Zahlen:
		continue
	else:
		Zahlen.append(Zahl)
		x = x + 1
		Zahlen.sort()
print(Zahlen)
Dein Problem lässt sich mit While und For lösen, das hat damit erstmal nicht so viel zu tun.
Du musst dir nur überlegen, wie du dir die Zahlen merken willst, die bereits "gezogen" wurden.

Also entweder könntest du die alle 3 Listen merken und dann darin suchen, ob die Zufallszahl "in Ordnung" ist.
Oder du erstellst vorab eine Liste mit möglichen Zahlen, die dann wie bei Lottokugeln nicht mehr "zurückgelegt" werden.

Das würde auch deinen bisherigen Code vereinfachen, weil du nicht mehr dauernd in "continue" rein laufen würdest.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Sülo
User
Beiträge: 29
Registriert: Dienstag 4. Mai 2021, 09:58

Kebap hat geschrieben: Montag 17. Januar 2022, 10:44 Bitte benutze den "Code" Button, damit dein Programm lesbar bleibt :wink:

Dein Problem lässt sich mit While und For lösen, das hat damit erstmal nicht so viel zu tun.
Du musst dir nur überlegen, wie du dir die Zahlen merken willst, die bereits "gezogen" wurden.

Also entweder könntest du die alle 3 Listen merken und dann darin suchen, ob die Zufallszahl "in Ordnung" ist.
Oder du erstellst vorab eine Liste mit Zahlen, die dann wie bei Lottokugeln nicht mehr "zurückgelegt" werden.

Das würde auch deinen bisherigen Code vereinfachen, weil du nicht mehr dauernd in "continue" rein laufen würdest.
Sülo hat geschrieben: Montag 17. Januar 2022, 10:37 Guten Tag liebe Programmierer!:)
Ich hab ein Problem:
Ich hab eine random Liste erstellt quasi wie beim Lotto 6 aus 49 nun will ich aber das mir das Programm die Liste 3x hintereinander ausgibt und darauf achtet, das die random zahlen nicht doppelt verwendet werden.

Folgendes habe ich schon geschrieben:

Code: Alles auswählen

import random

Zahlen = []
x = 0
while x < 6:
	Zahl = random.randint(1,49)
	if Zahl in Zahlen:
		continue
	else:
		Zahlen.append(Zahl)
		x = x + 1
		Zahlen.sort()
print(Zahlen)
ab jetzt komm ich nicht mehr weiter, wäre es doch sinnvoller auf eine for-schleife zu greifen?

danke schonmal im Voraus!


Oh sorry :D das war keine Absicht.
also würde ich quasi mit If weitermachen? ich komm halt nicht darauf wie ich es so schreiben soll das quasi [1,2,3,4,5,6] [7,8,9,10,11,12] [13,14,15,16,17,18] <- blödes Beispiel, aber die ausgabe sollte halt so sein.

ich werde noch verrückt:D
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sülo: Schau Dir mal die `random.sample()`-Funktion an.

Aus Deiner Aufgabenstellung wird auch nicht so ganz klar wo die Zahlen nicht doppelt vorkommen dürfen. Also in den 6 Zahlen ist klar, aber Du willst das ja drei mal machen — sollen die 3×6=18 Zahlen dann auch alle unterschiedlich sein, oder reicht es wenn die innerhalb der jeweiligen Ziehung unterschiedlich sind?

Nachtrag: Anmerkung zum Quelltext: `x` ist überflüssig denn das ist ja im Grunde die Länge der Liste und die kann man mit `len()` von der Liste abfragen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Also beispielsweise `zahl` statt `Zahl`. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sülo
User
Beiträge: 29
Registriert: Dienstag 4. Mai 2021, 09:58

__blackjack__ hat geschrieben: Montag 17. Januar 2022, 11:06 @Sülo: Schau Dir mal die `random.sample()`-Funktion an.

Aus Deiner Aufgabenstellung wird auch nicht so ganz klar wo die Zahlen nicht doppelt vorkommen dürfen. Also in den 6 Zahlen ist klar, aber Du willst das ja drei mal machen — sollen die 3×6=18 Zahlen dann auch alle unterschiedlich sein, oder reicht es wenn die innerhalb der jeweiligen Ziehung unterschiedlich sind?
Angegeben ist das wir random.sample nicht benutzen dürfen. :(
J also die Zahlen sollen sich in den 3 Listen (18 Zahlen) nicht doppeln.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sülo: Du mußt nicht immer den ganzen Beitrag zitieren, der steht ja direkt drüber.

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs. Variablennamen werden komplett klein geschrieben. `continue` sollte man sparsam einsetzen, weil es den Ablauf einer Schleife undurchsichtig macht, da Du eh mit `else` arbeitest, ist es hier unnötig, kann durch `pass` ersetzt werden, noch besser wäre es, einfach die Bedingung umzudrehen.
`x` muß man nicht selbst zählen, weil das einfach die Länge der Liste ist. Sortieren muß man nur einmal, nach der Schleife.

Code: Alles auswählen

import random

zahlen = []
while len(zahlen) < 6:
    zahl = random.randint(1, 49)
    if zahl not in zahlen:
        zahlen.append(zahl)

zahlen.sort()
print(zahlen)
Die ganze Schleife kann man durch `random.sample` ersetzen:

Code: Alles auswählen

import random

zahlen = sorted(random.sample(range(1, 50), 6))
print(zahlen)
Sülo
User
Beiträge: 29
Registriert: Dienstag 4. Mai 2021, 09:58

Sirius3 hat geschrieben: Montag 17. Januar 2022, 11:20 @Sülo: Du mußt nicht immer den ganzen Beitrag zitieren, der steht ja direkt drüber.

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs. Variablennamen werden komplett klein geschrieben. `continue` sollte man sparsam einsetzen, weil es den Ablauf einer Schleife undurchsichtig macht, da Du eh mit `else` arbeitest, ist es hier unnötig, kann durch `pass` ersetzt werden, noch besser wäre es, einfach die Bedingung umzudrehen.
`x` muß man nicht selbst zählen, weil das einfach die Länge der Liste ist. Sortieren muß man nur einmal, nach der Schleife.

Code: Alles auswählen

import random

zahlen = []
while len(zahlen) < 6:
    zahl = random.randint(1, 49)
    if zahl not in zahlen:
        zahlen.append(zahl)

zahlen.sort()
print(zahlen)
Die ganze Schleife kann man durch `random.sample` ersetzen:

Code: Alles auswählen

import random

zahlen = sorted(random.sample(range(1, 50), 6))
print(zahlen)


Danke ! Ja mit random.sample wäre es definitiv einfach aber ich darf es leider nicht nutzen so ist die Aufgabenstellung.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Komplettlösungsansatz:

Code: Alles auswählen

In [197]: from more_itertools import divide                                     

In [198]: n = 3                                                                 

In [199]: list(map(sorted, divide(n, random.sample(range(1, 50), 6 * n))))      
Out[199]: [[4, 20, 23, 24, 29, 30], [3, 7, 15, 26, 36, 43], [1, 25, 32, 37, 40, 45]]
Und ja, Du darfst `random.sample()` nicht verwenden — ich wollte auch Deine Hausaufgaben nicht lösen. 😛
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sülo
User
Beiträge: 29
Registriert: Dienstag 4. Mai 2021, 09:58

__blackjack__ hat geschrieben: Montag 17. Januar 2022, 11:33 Komplettlösungsansatz:

Code: Alles auswählen

In [197]: from more_itertools import divide                                     

In [198]: n = 3                                                                 

In [199]: list(map(sorted, divide(n, random.sample(range(1, 50), 6 * n))))      
Out[199]: [[4, 20, 23, 24, 29, 30], [3, 7, 15, 26, 36, 43], [1, 25, 32, 37, 40, 45]]
Und ja, Du darfst `random.sample()` nicht verwenden — ich wollte auch Deine Hausaufgaben nicht lösen. 😛
HAHA das ist Mies :D

aber ich habe da was gesehen was mir weiterhelfen könnte und zwar wenn ich die n = 3 bei mir einbaue bekomme ich eine ganze Liste aber 3x raus. jetzt muss ich die ja durch Divide noch teilen dann müsste es ja eigentlich klappen! Frage ist nur wo setze ich das divide rein?:D
Sülo
User
Beiträge: 29
Registriert: Dienstag 4. Mai 2021, 09:58

Also der neuste stand ist:

import random

zahlen = []
n = 6
x = 3
while len(zahlen) < 6 * x:
zahl = random.randint(1, 49)
if zahl not in zahlen:[
zahlen.append(zahl)

zahlen.sort()

output = [zahlen[i:i + n] for i in range(0, len(zahlen), n)]

print(output)


Soweit so gut hab ich dem prof gezeigt er ist nicht ganz zufrieden… er meinte das programm würde nun nur auf 1 liste zugreifen es soll aber füt jede 6 aus 49 aus einer neuen liste greifen und daist es egal ob beim ersten 6 aus 49 und beispielsweise aus der 3. liste von 6 aus 49 die zahlen gleich sind…. Hat da jemand ein tipp für mich? ( keine lösung nur den ansatz wo ich was verwenden könnte)
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das mit den Code-Tags, das wurde dir doch schon mitgeteilt, oder? So ist dein Code nunmal unlesbar.

Und die Aufgabe deines Profs wird trivial, wenn du deine Code (liste anlegen inklusive) in eine Funktion steckst, so wie man das eh machen sollte. Und die dann 3 mal aufrufst.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Auch wenn Du `random.sample` nicht verwenden darfst, wäre es gut eine eigene random_sample-Funktion zu schreiben. Die kannst Du dann in einer Schleife drei mal aufrufen.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

An die beiden Vorposter: Das mit dem dreimal aufrufen geht nicht, jedenfalls nicht mit einer generischen `random.sample()`-Funktion, denn die Zahlen sollen über alle drei Listen eindeutig sein, nicht nur in jeder der drei Einzellisten. Deswegen ist meine Lösung die `random.sample()` benutzt ja so ”kompliziert”. Andernfalls wäre das ja einfach nur eine einfache „list comprehension“ mit `random.sample()`. Also ``[random.sample(range(1, 50), 6) for _ in range(3)]`` ist laut Aufgabenstellung keine korrekte Lösung.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Sülo hat geschrieben: Dienstag 18. Januar 2022, 14:18 Soweit so gut hab ich dem prof gezeigt er ist nicht ganz zufrieden… er meinte das programm würde nun nur auf 1 liste zugreifen es soll aber füt jede 6 aus 49 aus einer neuen liste greifen und daist es egal ob beim ersten 6 aus 49 und beispielsweise aus der 3. liste von 6 aus 49 die zahlen gleich sind…. Hat da jemand ein tipp für mich? ( keine lösung nur den ansatz wo ich was verwenden könnte)
Wenn ich das richtig verstehe (und das ist wirklich nicht leicht zu entziffern), dann hat blackjack unrecht (und somit Sülo früher auch) und die Lösung ist leichter als zunächst angenommen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Sülo
User
Beiträge: 29
Registriert: Dienstag 4. Mai 2021, 09:58

Kebap hat geschrieben: Dienstag 18. Januar 2022, 21:15
Sülo hat geschrieben: Dienstag 18. Januar 2022, 14:18 Soweit so gut hab ich dem prof gezeigt er ist nicht ganz zufrieden… er meinte das programm würde nun nur auf 1 liste zugreifen es soll aber füt jede 6 aus 49 aus einer neuen liste greifen und daist es egal ob beim ersten 6 aus 49 und beispielsweise aus der 3. liste von 6 aus 49 die zahlen gleich sind…. Hat da jemand ein tipp für mich? ( keine lösung nur den ansatz wo ich was verwenden könnte)
Wenn ich das richtig verstehe (und das ist wirklich nicht leicht zu entziffern), dann hat blackjack unrecht (und somit Sülo früher auch) und die Lösung ist leichter als zunächst angenommen.

Wie hast du es Verstanden?
Also ich kann es ja nochmal Versuchen kurz zusammen zu fassen:
Ich soll ein Programm schreiben, welches 6 zufällige Zahlen aus einer Liste von 49 zieht. Dabei dürfen die Zahlen nicht doppelt vorkommen.
Das ganze soll jeweils aus 3 unterschiedlichen Listen passieren => dabei ist es egal ob die 6 zahlen der ersten liste mit den 6 zahlen aus den anderen Listen doppelt sind.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sülo: Beim letzten Satz hatte ich Dich anders verstanden, und zwar bei einer Antwort wo Ich explizit nachgefragt hatte welche der beiden Varianten gesucht ist.

Meine Frage war „[…] sollen die 3×6=18 Zahlen dann auch alle unterschiedlich sein, oder reicht es wenn die innerhalb der jeweiligen Ziehung unterschiedlich sind?“

Und geantwortet hattest Du „J also die Zahlen sollen sich in den 3 Listen (18 Zahlen) nicht doppeln.“

Vielleicht mein Fehler, dass ich bei „J(a?)“ auf eine entweder/oder Frage nicht noch mal nachgehakt habe. 🙂 Ich hatte die Angabe von den 18 Zahlen in Verbindung mit nicht doppeln dann halt auf diese 18 Zahlen bezogen verstanden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sülo
User
Beiträge: 29
Registriert: Dienstag 4. Mai 2021, 09:58

__blackjack__ hat geschrieben: Mittwoch 19. Januar 2022, 14:42 @Sülo: Beim letzten Satz hatte ich Dich anders verstanden, und zwar bei einer Antwort wo Ich explizit nachgefragt hatte welche der beiden Varianten gesucht ist.

Meine Frage war „[…] sollen die 3×6=18 Zahlen dann auch alle unterschiedlich sein, oder reicht es wenn die innerhalb der jeweiligen Ziehung unterschiedlich sind?“

Und geantwortet hattest Du „J also die Zahlen sollen sich in den 3 Listen (18 Zahlen) nicht doppeln.“

Vielleicht mein Fehler, dass ich bei „J(a?)“ auf eine entweder/oder Frage nicht noch mal nachgehakt habe. 🙂 Ich hatte die Angabe von den 18 Zahlen in Verbindung mit nicht doppeln dann halt auf diese 18 Zahlen bezogen verstanden.
Nein Nein das war mein Fehler, ich dachte auch das die Zahlen in den 3 Listen sich nicht wiederholen sollten bis der Prof. gesagt hat das es egal sei und die sich doppeln können da 3 verschiedene Listen mit jeweils 6 aus 49 gezogen werden. Nur in der Liste an sich sollen sie sich nicht doppeln.

[6, 2, 2, 3, 4, 5] <- nicht möglich
[1,2,3,4,5,6] [1,2,3,4,5,6] <- möglich
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann schreib eine Funktion, die einmal die Lottozahlen zieht. Und ruf die dreimal auf.
Sülo
User
Beiträge: 29
Registriert: Dienstag 4. Mai 2021, 09:58

__deets__ hat geschrieben: Mittwoch 19. Januar 2022, 15:35 Dann schreib eine Funktion, die einmal die Lottozahlen zieht. Und ruf die dreimal auf.
Das ist es ja, wie ich die Zahlen ziehe hab ich schon aber nicht wie ich es 3x wiederholen lassen soll😂😂
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Code: Alles auswählen

for _ in range(3):
    print(ziehe_lottozahlen())
Dazu muss eben dein bestehender Code in eine Funktion ziehe_lottozahlen.
Antworten