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
returnwieder 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
gruppenzunächst eine leere Liste hinzugefügt. -
Die richtige Anzahl an Wiederholungen erledigen wir mit
for i in range(anzahl_gruppen). Für drei Gruppen nimmtinacheinander 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 nachwhilestehen, doch hier steht eine Variable, die eine Liste enthält. Solange die Liste (noch) Elemente enthält, wertet Python sie zuTrueaus, erst wenn die Liste leer ist, wird sie zuFalseausgewertet. -
Von innen nach außen:
len(namensliste) - 1ist 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 ingruppenein, und zwar am Indexj % anzahl_gruppen.%ist der Modulo-Operator: wir erhalten den Rest einer Ganzzahldivision. (Also z.B. bei4 % 3wäre das1, und bei3 % 3wäre das0.)- Im Ergebnis wird, weil
jmit der Zeilej += 1bei 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 gruppengeben 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