Zufällige Gruppen

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 nimmt i 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 nach while stehen, doch hier steht eine Variable, die eine Liste enthält. Solange die Liste (noch) Elemente enthält, wertet Python sie zu True aus, erst wenn die Liste leer ist, wird sie zu False ausgewertet.

  • Von innen nach außen:

    • len(namensliste) - 1 ist der Wert des letzten Index in der Liste namensliste.
    • 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 in gruppen ein, und zwar am Index j % anzahl_gruppen.
    • % ist der Modulo-Operator: wir erhalten den Rest einer Ganzzahldivision. (Also z.B. bei 4 % 3 wäre das 1, und bei 3 % 3 wäre das 0.)
    • Im Ergebnis wird, weil j mit der Zeile j += 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 wie print('Gruppe ' + str(gruppennummer) + ':') möglich.
  • print() erzeugt eine Leerzeile