Zufällige Gruppen #
- Aufgabe: Funktion
vornamen_einlesen(dateiname)
mit möglichst wenig hingucken programmieren, soll eine Liste mit Vornamen zurückgeben.
def vornamen_einlesen(dateiname):
klassenlistendatei = open(dateiname, 'r')
vornamensliste = []
for zeile in klassenlistendatei:
felderliste = zeile.split(';')
vorname = felderliste[1]
vornamensliste.append(vorname)
klassenlistendatei.close()
return vornamensliste
- Wie wir eine Datei auslesen und den Vornamen in eine Liste schreiben, wissen wir eigentlich schon – der entsprechenden Funktion übergeben wir nun den Dateinamen, öffnen die Datei, lesen die Vornamen aus, fügen diese in eine Liste ein und geben diese Liste mit
return
wieder zurück.
from random import randint
def vornamen_einlesen(dateiname):
klassenlistendatei = open(dateiname, 'r')
vornamensliste = []
for zeile in klassenlistendatei:
felderliste = zeile.split(';')
vorname = felderliste[1]
vornamensliste.append(vorname)
klassenlistendatei.close()
return vornamensliste
def gruppiere_sus(anzahl_gruppen, namensliste):
gruppen = []
for i in range(anzahl_gruppen):
gruppen.append([])
j = 0
while namensliste:
gruppen[j%anzahl_gruppen].append(namensliste.pop(randint(0, len(namensliste) - 1)))
j += 1
return gruppen
if __name__ == '__main__':
vornamen = vornamen_einlesen('8A-Muster.csv')
zufallsgruppen = gruppiere_sus(5, vornamen)
print(zufallsgruppen)
-
Die Funktion soll eine Liste von Listen zurückgeben: jede der Listen enthält dann die Teilnehmer_innen einer Gruppe. Also wird für jede Gruppe, die benötigt wird, der Liste
gruppen
zunächst eine leere Liste hinzugefügt. -
Die richtige Anzahl an Wiederholungen erledigen wir mit
for i in range(anzahl_gruppen)
. Für drei Gruppen nimmti
nacheinander die Werte 0, 1 und 2 an, die aber gar nicht benötigt werden. -
OPTIONAL: Dies gelänge auch kürzer, mit der Zeile:
gruppen = [ [] for i in range (anzahl_gruppen) ]
-
Um die Listen nun geeignet mit Namen zu bestücken, wird eine
while
-Schleife verwendet. Hier wird ein phytonischer Trick verwendet: eigentlich muss ja ein bool’scher Ausdruck nachwhile
stehen, doch hier steht eine Variable, die eine Liste enthält. Solange die Liste (noch) Elemente enthält, wertet Python sie zuTrue
aus, erst wenn die Liste leer ist, wird sie zuFalse
ausgewertet. -
Von innen nach außen:
len(namensliste) - 1
ist der Wert des letzten Index in der Listenamensliste
.randint(0, len(namensliste) - 1)
erzeugt einen zufälligen Index.(namensliste.pop(randint(0, len(namensliste) - 1)))
gibt den Namen am gewählten Index zurück und entfernt ihn gleichzeitig aus der Liste.gruppen[j%anzahl_gruppen].append(namensliste.pop(randint(0, len(namensliste) - 1)))
fügt den eben gewonnenen Namen in eine der Listen ingruppen
ein, und zwar am Indexj % anzahl_gruppen
.%
ist der Modulo-Operator: wir erhalten den Rest einer Ganzzahldivision. (Also z.B. bei4 % 3
wäre das1
, und bei3 % 3
wäre das0
.)- Im Ergebnis wird, weil
j
mit der Zeilej += 1
bei jedem Schleifendurchlauf um eins erhöht wird, der Index wiederholt durchlaufen. Wir teilen jeder Gruppe nach und nach Schüler_innen zu, auf diese Weise unterscheiden die Gruppengrößen sich zum Schluss um höchstens 1.
-
Mit
return gruppen
geben wir nun eine Liste von Gruppenlisten zurück. -
Aufgabe: Funktion
pretty_print(liste_von_gruppen)
schreiben, soll die Gruppen schön dargestellt auf der Konsole ausgeben.
from random import randint
def vornamen_einlesen(dateiname):
klassenlistendatei = open(dateiname, 'r')
vornamensliste = []
for zeile in klassenlistendatei:
felderliste = zeile.split(';')
vorname = felderliste[1]
vornamensliste.append(vorname)
klassenlistendatei.close()
return vornamensliste
def gruppiere_sus(anzahl_gruppen, namensliste):
gruppen = []
for i in range(anzahl_gruppen):
gruppen.append([])
# für Interessierte: geht auch mit: gruppen = [ [] for i in range (anzahl_gruppen) ]
j = 0
while namensliste:
gruppen[j%anzahl_gruppen].append(namensliste.pop(randint(0, len(namensliste) - 1)))
j += 1
return gruppen
def pretty_print(liste_von_gruppen):
gruppennummer = 1
for gruppe in liste_von_gruppen:
print(f'Gruppe {gruppennummer}:')
for mitglied in gruppe:
print(mitglied)
gruppennummer += 1
print()
if __name__ == '__main__':
vornamen = vornamen_einlesen('8A-Muster.csv')
zufallsgruppen = gruppiere_sus(5, vornamen)
pretty_print(zufallsgruppen)
- statt
print(f'Gruppe {gruppennummer}:')
wäre auch so etwas wieprint('Gruppe ' + str(gruppennummer) + ':')
möglich. print()
erzeugt eine Leerzeile