Unterschiedliche und zufällige Einträge aus Listen

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
lenaslnr
User
Beiträge: 9
Registriert: Mittwoch 8. April 2020, 16:23

Hallo,

ich würde gerne aus zwei bestehenden Listen eine weitere Liste bilden mit einer bestimmten Anzahl an Einträgen. Hier bei sollen aus den bestehenden Listen eine bestimmte Anzahl von den jeweiligen Elementen eingefügt werden.
Soweit bin ich schon. Jetzt würde ich jedoch gern gewährleisten, dass die Einträge unterschiedlich sind.
Wie muss ich meine Methode denn dahin gehend verändern?
Hier mal meine Methode:

def display_exercise(self):
exercise = self.select_exercise()
polynom = exercise['polynom']
correct_factors = exercise['correct_factor']
wrong_factors = exercise['wrong_factor']
factors = []
value = random.randint(5, 10)
r = random.SystemRandom()
debug = 0

for i in range(0, value):
# in factors[] Elemente einfügen
factors.append(r.choice(correct_factors))
for i in range(value, 16):
factors.append(r.choice(wrong_factors))



print(polynom, factors)
#return polynom, factors

Meine Ausgabe in der Console ist bisher eben das polynom und eine Liste factors mit Elementen aus den Listen correct_factors und wrong_factors
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Du suchst wohl random.sample.
lenaslnr
User
Beiträge: 9
Registriert: Mittwoch 8. April 2020, 16:23

Sirius3 hat geschrieben: Donnerstag 16. April 2020, 18:18 Du suchst wohl random.sample.
Das funktioniert leider nicht wenn ich das statt random.SystemRandom() schreibe, da bekomme ich eine Fehlermeldung?

Brauch ich dann auch eine andere Funktion als choice?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Du sollst das ja auch statt der Schleife und choice benutzen. Hast Du denn in der Dokumentation überhaupt nachgelesen, was sample macht?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@lenaslnr: Die hart kodierten magischen Zahlen sind nicht gut. Das sollten mindestens Konstanten sein, und falls Werte von anderen Werten abhängig sind, dann sollten die berechnet werden. Im Moment kann man beispielsweise nicht sagen ob das jetzt zufällig ein bis zwei drittel richtige Faktoren sind, oder ob das Absicht ist. Falls das Absicht ist, sollten die 5 und die 10 entsprechend aus der 15 berechnet werden. Und die 15 passt auch immer garantiert zu dem Wert in `polynom`? Wie ist das sichergestellt?

Das sieht mir auch sehr nach einer Funktion aus statt nach einer Methode. Soll in einer `display…`-Funktion nicht eher tatsächlich nur etwas angezeigt werden, statt da am Anfang noch einen Aufruf zu machen der erst noch etwas aswählt das angezeigt wird?

Zwischenstand, ungetestet:

Code: Alles auswählen

def display_exercise(exercise):
    correct_factor_count = random.randint(5, 10)
    random_generator = random.SystemRandom()
    factors = random_generator.sample(
        exercise["correct_factor"], correct_factor_count
    ) + random_generator.sample(
        exercise["wrong_factor"], 15 - correct_factor_count
    )
    print(exercise["polynom"], factors)
Aus dem Wörterbuch könnte man eventuell auch ein eigenständiges Objekt machen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
lenaslnr
User
Beiträge: 9
Registriert: Mittwoch 8. April 2020, 16:23

__blackjack__ hat geschrieben: Freitag 17. April 2020, 14:28 @lenaslnr: Die hart kodierten magischen Zahlen sind nicht gut. Das sollten mindestens Konstanten sein, und falls Werte von anderen Werten abhängig sind, dann sollten die berechnet werden. Im Moment kann man beispielsweise nicht sagen ob das jetzt zufällig ein bis zwei drittel richtige Faktoren sind, oder ob das Absicht ist. Falls das Absicht ist, sollten die 5 und die 10 entsprechend aus der 15 berechnet werden. Und die 15 passt auch immer garantiert zu dem Wert in `polynom`? Wie ist das sichergestellt?

Das sieht mir auch sehr nach einer Funktion aus statt nach einer Methode. Soll in einer `display…`-Funktion nicht eher tatsächlich nur etwas angezeigt werden, statt da am Anfang noch einen Aufruf zu machen der erst noch etwas aswählt das angezeigt wird?

Zwischenstand, ungetestet:

Code: Alles auswählen

def display_exercise(exercise):
    correct_factor_count = random.randint(5, 10)
    random_generator = random.SystemRandom()
    factors = random_generator.sample(
        exercise["correct_factor"], correct_factor_count
    ) + random_generator.sample(
        exercise["wrong_factor"], 15 - correct_factor_count
    )
    print(exercise["polynom"], factors)
Aus dem Wörterbuch könnte man eventuell auch ein eigenständiges Objekt machen.
Ah alles klar danke dir! Ja das bit den 5 und 15 soll eine zufällige zahl sein das war absicht. ich möchte die auch gar nicht berechnen, weil ich ein spielfeld habe auf dem immer wenn es geladen wird eine andere anzahl an "richtigen" und"falschen" Faktoren angezeigt wird!

Und die MEthode/Funktion habe ich zu create_exercise umbenannt, da sie tatsächlich die aufgabe nicht anzeigt, lediglich erstellt.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@lenaslnr: Ich weiss nicht ob Du das mit 5, 10, und15 richtig verstanden hast, denn Deine Antwort macht für mich keinen Sinn. Mir geht es darum wo a) die 15 her kommt, und b) wieso 5 und 10 als Grenzen für die Zufallszahl. Alle drei Zahlen sollten da nicht als literale, magische Zahlen so im Code stehen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten