Per Zufall Einträge in einer Liste auswählen?

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
ledzep1981
User
Beiträge: 2
Registriert: Freitag 10. Dezember 2010, 22:47

Hi wie geht das das man in einer Liste mit einträgen per Zufall einen davon ausfwählt und dann ausgibt?
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

>>> import random
>>> l = ['foo', 'bar', 'baz']
>>> for x in random.sample(l, len(l)):
...     print x
...     
...     
baz
bar
foo
Wenn's wirklich nur einer sein soll: `random.choice(l)`. Beachte: "Zufall" kann auch bedeuten, dass du mehrfach hintereinander den selben Wert erhälst. Das fällt besonders bei Listen mit wenigen Elementen auf.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Um das zu vermeiden, kannst du eine Kopie der Liste erstellen und ein Element entfernen, nachdem es "geyieldet" wurde (meiner Meinung nach bietet sich nämlich ein Generator an). Hängt von deinem Ziel ab, was du vorhast.
BlackJack

@derdon: Statt die Liste bei jedem "gezogenen" Element zu verändert, könnte man sie auch einmal am Anfang "mischen" und dann einfach einen Iterator über die "gemischte" Liste verwenden.
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ja, entweder in-place (`random.shuffle()`) oder eben mittels Kopie mit `random.sample()`. Alles andere macht die Sache imho nur unnötig kompliziert.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Stimmt. War Quatsch, was ich gesagt hab.
ledzep1981
User
Beiträge: 2
Registriert: Freitag 10. Dezember 2010, 22:47

danke für die antwort mach so ne art wissenquiz und hab die fragen in kategorien unterteilt nach denen ich vor frage. dementsprechend hab ich das ganze auf mehrere listen aufgeteilt und hab jetzt mit random.choice aus jeder liste ne zufallsauswahl gemacht. die zufallsauswahl hab ich dann in eine funktion gepackt die ich nach abfrage der kategorie dann aufrufe.

das problem ich hab x-if abfragen die ich zwar ordentlich kommentiere aber kann man das ganze net evlt. einfacher lösen. beim dictionary wären ja frage und antwort schon in einem schlüsselpaar. wie kann ich vergleichen wenn ich ne eingabe machen ob die dann auch stimmt. das heißt das eben die antwort zum schlüsselpaar des dictionaries gehört.
BlackJack hat geschrieben:@derdon: Statt die Liste bei jedem "gezogenen" Element zu verändert, könnte man sie auch einmal am Anfang "mischen" und dann einfach einen Iterator über die "gemischte" Liste verwenden.
hmm. ja wie funktioniert das genau?

bin jetzt bei byte of python gerade am ende von kapitel 9 und wollte mal ein größeres praktisches programm schreiben, also eben das quiz, mit dem ich was dazu lerne.

mein programm funktioniert soweit. kann ich den programmcode hier mal posten? oder im unterforum für codeschnipsel?
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

ledzep1981 hat geschrieben:
BlackJack hat geschrieben:@derdon: Statt die Liste bei jedem "gezogenen" Element zu verändert, könnte man sie auch einmal am Anfang "mischen" und dann einfach einen Iterator über die "gemischte" Liste verwenden.
hmm. ja wie funktioniert das genau?
Das habe ich in meinen beiden Beiträgen beschrieben.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@ledzep1981: Du solltest neben ABoP auch immer die offizielle Doku in einem browser offen haben. Dann kannst Du im random-Modul einfach mal nachgucken, wie die genannten Funktionen aufzurufen sind bzw. was sie bewirken. Und dann probierst Du es einfach in einer Shell aus :-)

Generell solltest Du Dir Gedanken über Deine Datenstrukturen machen; das ganze vor dem Kontext, welche Operationen darauf ausgeführt werden sollen. Dazu können wir mit den bisherigen Infos schlecht etwas sagen. Evtl. beschreibst Du (in einem neuen Thread?) die geplanten Spielregeln und/oder postest Deinen (hoffentlich kommentierten) Quellcode im Pastebin (s. oben in der Menüleiste). Evtl. können wir Dir dan Tipps geben, ob oder auch wie man etwas eleganter / besser lösen kann.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten