5 zufällige Listen aus bestehender Liste erstellen

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
no_lita
User
Beiträge: 4
Registriert: Donnerstag 19. November 2020, 14:10

Hallo liebes Python-Forum ! Dies ist meine erste Frage hier und ich hoffe ihr könnt mir weiterhelfen:

Ich habe eine Liste gegeben : meine_liste = ["ottos", "mops", "kotzt"]
Ausgehend von dieser Liste sollen fünf Ausgaben einer zufälligen Reihenfolge dieser Elemente ausgegeben werden.
Dafür soll random.sample(meine_liste, 3) genutzt werden.
Wenn eine Liste ausgegeben wird, die schon mal vorkam, soll stattdessen (Wiederholung) ausgegeben werden.
Soll dann z.B. so aussehen:
['ottos', 'mops', 'kotzt']
['mops', 'kotzt', 'ottos']
(Wiederholung)
['kotzt', 'ottos', 'mops']
(Wiederholung)

ich habe als erstes eine leere Liste angelegt und wollte die dann immer mit einer zufälligen Liste überschreiben und dann jedes mal neu prüfen, ob die Listen identisch sind. Das ganze dann 5 mal. kriege aber das mit dem überschreiben nicht hin. überhaupt hatte ich bei vielen variant schon viele eigenartige Lösungen raus, aber nie das was ich haben will...
Hier mein Versuch:

import random
meine_liste = ["ottos", "mops", "kotzt"]
sample_liste = [ ]
random_liste = random.sample(lexikon, 3)

for i in range(5):
if random_liste not in sample_liste:
sample_liste = sample_liste + random_liste
print(sample_liste)
else:
print("Wiederholung")

Danke schon mal im Voraus !! Grüße :)
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Du gibst ja immer sample_liste aus, solltest also sehen, was der Inhalt der Liste ist. Was fällt Dir dabei auf?

lexikon ist nicht definiert, dafür aber ein meine_liste, an dessen Namen zwei Dinge schlecht ist: das meine ist nichtssagend, solange es nicht auch ein euer gibt. Und liste ist ein Datentyp, der aber in einem Variablennamen nichts verloren hat.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@no_lita: Die Aufgabenbeschreibung ist IMHO nicht ganz eindeutig. Sollen genau 5 Ausgaben erfolgen oder soll solange ausgegeben werden bis 5 Listen ausgegeben wurden?

Es reicht auf jeden Fall nicht sich nur die letzte Ausgabe zu merken.

Randbemerkung: *Identisch* können die Listen nicht sein, nur *gleich*. Denn `sample()` liefert immer eine neue Liste die nicht identisch zu einer anderen Liste im Programm sein kann. Ein subtiler Unterschied der aber entscheidet welcher Vergleichsoperator verwendet werden muss wenn man zwei Objekte vergleicht: ``is`` testet ob die Operanden *identisch* sind, und ``==`` ob die Operanden *gleich* sind.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
no_lita
User
Beiträge: 4
Registriert: Donnerstag 19. November 2020, 14:10

@sirius3 : die verwechslung mit lexikon/meine_liste tut mir leid...hatte das für das forum nochmal unbenannt aber anscheinend nicht einheitlich. daran lags aber nicht :)

@_blackjack_: es sollen insgesamt 5 listen ausgegeben werden. kann also theoretisch auch 4 mal "Wiederholung" und nur eine liste kommen....
no_lita
User
Beiträge: 4
Registriert: Donnerstag 19. November 2020, 14:10

habe den code abgeändert. bekomme jetzt 5 zufällige Listen , aber bei gleichen Listen bekomme ich nicht "Wiederholung" ausgegeben...

import random
lexikon = ["ottos", "mops", "kotzt"]
sample_liste = []
random_liste = random.sample(lexikon, 3)

for i in range(5):
random_liste = random.sample(lexikon, 3)
if random_liste == sample_liste:
print("Wiederholung")
else:
print(sample_liste + random_liste)
no_lita
User
Beiträge: 4
Registriert: Donnerstag 19. November 2020, 14:10

habs gelöst:

mport random
lexikon = ["ottos", "mops", "kotzt"]
sample_liste = []
random_liste = random.sample(lexikon, 3)

for i in range(5):
random_liste = random.sample(lexikon, 3)
if random_liste not in sample_liste:
sample_liste.append(random_liste)
print(random_liste)
elif random_liste in sample_liste:
print("Wiederholung")


VIELEN DANK :)
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@no_lita: Es sollen also *nicht* 5 Listen ausgegeben werden sondern 5 Ausgaben gemacht werden. Denn wenn "(Wiederholung)" ausgegeben wird, dann ist das ja keine Ausgabe einer Liste. Wenn 5 Listen ausgegeben werden sollen, dann könnte eine Ausgabe ja beispielsweise so aussehen:

Code: Alles auswählen

'mops', 'ottos', 'kotzt']
(Wiederholung)
['ottos', 'kotzt', 'mops']
['kotzt', 'mops', 'ottos']
(Wiederholung)
['kotzt', 'ottos', 'mops']
(Wiederholung)
(Wiederholung)
(Wiederholung)
(Wiederholung)
(Wiederholung)
['ottos', 'mops', 'kotzt']
Das ``elif`` ist unnötig denn es kann ja nur zwei Fälle geben und wenn der eine nicht zutrifft braucht man den anderen nicht explizit prüfen. Das ist einfach ``if``/``else``.

Sirius3 erwähnte es bereits: Grunddatentypen wie `liste` haben nichts im Namen zu suchen.

Der `sample()`-Aufruf sollte nur einmal im Code vorkommen. Der erste vor der Schleife erzeugte Wert von `random_liste` wird ja auch gar nirgends verwendet.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn die Bedingung des elif exakt das Gegenteil von der im if ist, dann benutzt man else.

Code: Alles auswählen

import random
lexikon = ["ottos", "mops", "kotzt"]

samples = []
for i in range(5):
    sample = random.sample(lexikon, len(lexikon))
    if sample not in samples:
        samples.append(sample)
        print(sample)
    else:
        print("Wiederholung")
Antworten