Auslosung mit Gruppen

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
Zayju
User
Beiträge: 12
Registriert: Mittwoch 22. Januar 2020, 15:43

Hey Nochmal,

ich habe schonmal einen Artikel verfasst, der sich mit diesem Problem befasste. Fogendes: ich habe bestimmte Teams, die ich in Gruppen aufteilen will. Doch irgendwie läuft etwas im Programm schief. Ich kriege zwar keine Fehlermeldung aber die Gruppeneinteilung ist ungleichmäßig. Vielleicht muss ich beim else noch etwas hinzufügen. Im Code sollte man das vielleicht finden können. Würde mich über eine Antwort freuen. Hier kann es so aussehen als wären die Einrückungen falsch, sind sie aber nicht.

#Importierungen
import random

#Gruppen & Teilnehmer
gruppen = ["Gruppe A", "Gruppe B", "Gruppe C", "Gruppe D"]

members = ["Na'Vi", "Virtus Pro", "Mousesports", "FaZe Clan", "Astralis", "Ninjas in Pyjamas",
"Team Liquid", "Fnatic", "Team Vitality", "Espada", "Ence", "Cloud 9", "G2 Esports",
"OG", "Furia", "Complexity"]

#Rechnungsvariablen
max_a = int(len(members)) / int(len(gruppen))
max_b = int(len(members)) / int(len(gruppen))
max_c = int(len(members)) / int(len(gruppen))
max_d = int(len(members)) / int(len(gruppen))
max_e = int(len(members)) / int(len(gruppen))
max_f = int(len(members)) / int(len(gruppen))
max_g = int(len(members)) / int(len(gruppen))
max_h = int(len(members)) / int(len(gruppen))
max_i = int(len(members)) / int(len(gruppen))
max_j = int(len(members)) / int(len(gruppen))


#Gruppen
Gruppe_A = []
Gruppe_B = []
Gruppe_C = []
Gruppe_D = []
Gruppe_E = []
Gruppe_F = []
Gruppe_G = []
Gruppe_H = []
Gruppe_I = []
Gruppe_J = []

print(int(len(members)))

for i in range(int(len(members))):
name = random.choice(members)
members.remove(name)

gruppe = random.choice(gruppen)

if gruppe == "Gruppe A" and len(Gruppe_A) < max_a:
if len(Gruppe_A) == max_a:
gruppen.remove("Gruppe A")
else:
Gruppe_A.append(name)

if gruppe == "Gruppe B" and len(Gruppe_B) < max_b:
if len(Gruppe_B) == max_a:
gruppen.remove("Gruppe B")
else:
Gruppe_B.append(name)

if gruppe == "Gruppe C" and len(Gruppe_C) < max_c:
if len(Gruppe_C) == max_c:
gruppen.remove("Gruppe C")
else:
Gruppe_C.append(name)

if gruppe == "Gruppe D" and len(Gruppe_D) < max_d:
if len(Gruppe_D) == max_c:
gruppen.remove("Gruppe D")
else:
Gruppe_D.append(name)
else:
pass

print(Gruppe_A)
print(Gruppe_B)
print(Gruppe_C)
print(Gruppe_D)
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man anfängt, Variablennamen durchzunummerieren (ähm, durchzubuchstabieren), dann will man eigentlich eine passende Datenstruktur benutzen, z.B. Listen.
Dann braucht man auch nicht 90% des Codes durch kopieren und einzelne Zeichen ändern, erzeugen.
Die ganzen max_y-Variablen haben den selben Wert, den braucht es also auch nur einmal. len liefert schon ein int, das nochmal umzuwandeln, ist unnötig.
Eine for-Schleife über einen Index ist ein Code-Smell. Hier möchtest Du erst die Members durchwürfeln (random.shuffle) und dann alle Member mit einer Schleife durchgehen.

Bleibt also das:

Code: Alles auswählen

#Importierungen
import random

members = ["Na'Vi", "Virtus Pro", "Mousesports", "FaZe Clan", "Astralis", "Ninjas in Pyjamas",
           "Team Liquid", "Fnatic", "Team Vitality", "Espada", "Ence", "Cloud 9", "G2 Esports",
           "OG", "Furia", "Complexity"]

#Rechnungsvariablen
alle_gruppen = [[] for _ in range(4)]
maximal_anzahl = len(members) / len(alle_gruppen)

print(len(members))
random.shuffle(members)
gruppen = list(alle_gruppen)
for name in members:
    gruppe = random.choice(gruppen)
    if len(gruppe) < maximal_anzahl:
        gruppe.append(name)
    else:
        gruppen.remove(gruppe)
print(alle_gruppen)
Jetzt bleibt noch das Problem, wenn eine ausgewählte Gruppe schon voll ist, dass dann der Name weggeworfen wird. Du also gleich nach dem Füllen prüfen mußt, ob die Maximalanzahl erreicht wurde.
Antworten