Auslosung mit Gruppen
Wenn du die Codetags im Forum verwendest, sehen die Einrückungen auch richtig aus
Dein Code ist für mich leider nicht gut verständlich und wirkt zu kompliziert. Möchtest du einfach nur 16 Personen in vier 4er Teams einteilen, oder was ist das Ziel? Was hat es mit dem Leader auf sich?

Zuletzt geändert von nezzcarth am Dienstag 12. Mai 2020, 21:16, insgesamt 1-mal geändert.
- __blackjack__
- User
- Beiträge: 13927
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Zayju: Also falls Du die 16 `members` auf vier gleich grosse Gruppen aufteilen willst, ist das da alles sehr viel und sehr komischer Code. Denn dafür würde man einfach die `members` mischen = eine Zeile Code mit der passenden Funktion aus dem `random`-Modul. Und dann die gemischte Liste mittels Slicing-Syntax + „list comprehension“ in vier gleich grosse Liste aufteilen = eine weitere Zeile Code.
Man nummeriert keine Namen durch – statt Nummern dafür Buchstaben zu nehmen macht das es vom Prinzip her nicht besser. Die vier Gruppen sollten in einer Datenstruktur stecken. Beispielsweise in einer Liste.
Man nummeriert keine Namen durch – statt Nummern dafür Buchstaben zu nehmen macht das es vom Prinzip her nicht besser. Die vier Gruppen sollten in einer Datenstruktur stecken. Beispielsweise in einer Liste.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
Hier habe ich den Code neu geschrieben habe den Fehler schon entdeckt. Aber danke trotzdem. Ich mochte diesen Code auch überahupt nichtnezzcarth hat geschrieben: ↑Dienstag 12. Mai 2020, 21:15 Wenn du die Codetags im Forum verwendest, sehen die Einrückungen auch richtig ausDein Code ist für mich leider nicht gut verständlich und wirkt zu kompliziert. Möchtest du einfach nur 16 Personen in vier 4er Teams einteilen, oder was ist das Ziel? Was hat es mit dem Leader auf sich?
Hier habe ich den Code neu geschrieben habe den Fehler schon entdeckt. Aber danke trotzdem. Ich mochte diesen Code auch überahupt nichtnezzcarth hat geschrieben: ↑Dienstag 12. Mai 2020, 21:15 Wenn du die Codetags im Forum verwendest, sehen die Einrückungen auch richtig ausDein Code ist für mich leider nicht gut verständlich und wirkt zu kompliziert. Möchtest du einfach nur 16 Personen in vier 4er Teams einteilen, oder was ist das Ziel? Was hat es mit dem Leader auf sich?
-
- User
- Beiträge: 510
- Registriert: Mittwoch 13. November 2019, 08:38
Anstatt deinen ursprünglichen Beitrag zu löschen, wäre es hilfreich diesen stehen zu lassen und deine jetzige Lösung zu posten. So können Leute, die ein gleiches oder ähnliches Problem haben ebenfalls davon profitieren und müssen nicht die selbe Frage noch mal stellen.
- DeaD_EyE
- User
- Beiträge: 1206
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Das hab ich 10 Jahre lang ständig erlebt. Entweder man muss den Leuten förmlich die Information aus der Nase ziehen oder sie finden dann eine Lösung und sind dann für immer weg ohne die Lösung zu posten. Der nächste, der dann eine Frage hat, den Thread findet, wird enttäuscht und das tritt leider sehr häufig auf.
Es geht hier nicht darum das Gesicht zu verlieren, sondern zu lernen.
Wer niemals Fehler macht, der lernt auch nichts.
Jemand, der viele Fehler macht, kann aus diesen auch lernen und andere natürlich auch, was Sinn und Zweck eines Forums ist.
Es geht hier nicht darum das Gesicht zu verlieren, sondern zu lernen.
Wer niemals Fehler macht, der lernt auch nichts.
Jemand, der viele Fehler macht, kann aus diesen auch lernen und andere natürlich auch, was Sinn und Zweck eines Forums ist.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
- __blackjack__
- User
- Beiträge: 13927
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Zayju: Mit Code-Tags bleibt die Einrückung erhalten und Dein Code sähe dann so aus:
Auch wenn der Code nicht so sinnvoll ist, trotzdem ein paar Anmerkungen dazu:
`Group_A` bis `Group_D` sind im Grunde redundante Informationen weil das herunterzählen und testen auf ≤0 ersetzt werden kann durch einen Test ob die entsprechene Gruppe bereits vier Einträge hat. Man kann von Listen ja die Länge ermitteln.
`members` sollte laut Kommentar und Textausgabe wohl eher `teams` heissen.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Falls man einen Namen braucht, der aber absichtlich nirgends verwendet wird, wie bei dem `i`, gibt es die Konvention `_` als Namen dafür zu verwenden, damit der Leser weiss, dass der Name nirgends verwendet wird.
`len()` liefert bereits eine ganze Zahl. Da noch mal `int()` mit aufzurufen macht also keinen Sinn.
Wobei man aus dem ``for``-Schleifenkopf auch einfach ein ``while teams:`` machen kann, da Du ja die Teams aus der Liste entfernst.
Funktionen definiert man nicht in einer Schleife, weil dann in jedem Schleifendurchlauf eine neue Funktion definiert wird, die sich in diesem Fall aber gar nicht von den anderen unterscheidet, die vorher und nachher in der Schleife definiert werden. Das macht keinen Sinn, und man kann die Funktion auch nicht separat testen oder wiederverwenden.
Funktionsnamen beschreiben üblicherweise die Tätigkeit der Funktion, damit der Leser weiss was die macht. `func()` ist also gar kein guter Funktionsname.
Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben. `func()` benötigt also `groups`, und die vier Listen wenn man sich die extra Zähler spart die aus der Länge der Listen abgeleitet werden können.
Die `remove()`-Methode auf Listen sucht das zu entfernende Element linear in der Liste. Es wäre also effizienter im ersten Schritt nicht ein zufälliges Element zu wählen und das dann zu suchen/entfernen, sondern einen zufälligen Index zu wählen und den dann der `pop()`-Methode zu übergeben um sich das suchen zu sparen.
``else``-Zweige in denen nur ein ``pass`` stehen, machen keinen Sinn.
Die lokalen Namen `a` bis `d` machen keinen Sinn. Die werden mit `True` initialisiert und dann auf `True` getestet, was ja immer wahr sein muss, weil sie mit dem Wert ja kurz zuvor initialisiert wurden. Und dann werden sie eventuell auf `False` gesetzt, aber nie wieder verwendet. Ausser ein bisschen Rechenzeit verbrauchen und den Leser zu verwirren, passiert da nichts was einen Effekt auf den Programmablauf hätte.
Überarbeitet säher der (fehlerhafte) Code dann so aus:
Hier wäre mein Ansatz das Problem zu lösen:
Code: Alles auswählen
import random
Group_A = 4
Group_B = 4
Group_C = 4
Group_D = 4
#Gruppen
groups = ["Group A", "Group B", "Group C", "Group D"]
Gruppe_A = []
Gruppe_B = []
Gruppe_C = []
Gruppe_D = []
#Teams
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"]
print(f"{len(members)} teams are playing!")
for i in range(int(len(members))):
leader = random.choice(members)
members.remove(leader)
#Gruppen Auswahl
gruppe = random.choice(groups)
# Gruppenfunktion
def func():
a = True
b = True
c = True
d = True
if Group_A <= 0 and a == True:
groups.remove("Group A")
a = False
else:
pass
#--------------------------------------------------------------------------
if Group_B <= 0 and b == True:
groups.remove("Group B")
b = False
else:
pass
#--------------------------------------------------------------------------
if Group_C <= 0 and c == True:
groups.remove(("Group C"))
c = False
else:
pass
#--------------------------------------------------------------------------
if Group_C <= 0 and d == True:
groups.remove(("Group D"))
d = False
else:
pass
if gruppe == "Group A":
func()
Gruppe_A.append(leader)
Group_A -= 1
elif gruppe == "Group B":
func()
Gruppe_B.append(leader)
Group_B -= 1
elif gruppe == "Group C":
func()
Gruppe_C.append(leader)
Group_C -= 1
elif gruppe == "Group D":
func()
Gruppe_D.append(leader)
Group_D -= 1
print(Gruppe_A)
print(Gruppe_B)
print(Gruppe_C)
print(Gruppe_D)
`Group_A` bis `Group_D` sind im Grunde redundante Informationen weil das herunterzählen und testen auf ≤0 ersetzt werden kann durch einen Test ob die entsprechene Gruppe bereits vier Einträge hat. Man kann von Listen ja die Länge ermitteln.
`members` sollte laut Kommentar und Textausgabe wohl eher `teams` heissen.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Falls man einen Namen braucht, der aber absichtlich nirgends verwendet wird, wie bei dem `i`, gibt es die Konvention `_` als Namen dafür zu verwenden, damit der Leser weiss, dass der Name nirgends verwendet wird.
`len()` liefert bereits eine ganze Zahl. Da noch mal `int()` mit aufzurufen macht also keinen Sinn.
Wobei man aus dem ``for``-Schleifenkopf auch einfach ein ``while teams:`` machen kann, da Du ja die Teams aus der Liste entfernst.
Funktionen definiert man nicht in einer Schleife, weil dann in jedem Schleifendurchlauf eine neue Funktion definiert wird, die sich in diesem Fall aber gar nicht von den anderen unterscheidet, die vorher und nachher in der Schleife definiert werden. Das macht keinen Sinn, und man kann die Funktion auch nicht separat testen oder wiederverwenden.
Funktionsnamen beschreiben üblicherweise die Tätigkeit der Funktion, damit der Leser weiss was die macht. `func()` ist also gar kein guter Funktionsname.
Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben. `func()` benötigt also `groups`, und die vier Listen wenn man sich die extra Zähler spart die aus der Länge der Listen abgeleitet werden können.
Die `remove()`-Methode auf Listen sucht das zu entfernende Element linear in der Liste. Es wäre also effizienter im ersten Schritt nicht ein zufälliges Element zu wählen und das dann zu suchen/entfernen, sondern einen zufälligen Index zu wählen und den dann der `pop()`-Methode zu übergeben um sich das suchen zu sparen.
``else``-Zweige in denen nur ein ``pass`` stehen, machen keinen Sinn.
Die lokalen Namen `a` bis `d` machen keinen Sinn. Die werden mit `True` initialisiert und dann auf `True` getestet, was ja immer wahr sein muss, weil sie mit dem Wert ja kurz zuvor initialisiert wurden. Und dann werden sie eventuell auf `False` gesetzt, aber nie wieder verwendet. Ausser ein bisschen Rechenzeit verbrauchen und den Leser zu verwirren, passiert da nichts was einen Effekt auf den Programmablauf hätte.
Überarbeitet säher der (fehlerhafte) Code dann so aus:
Code: Alles auswählen
#!/usr/bin/env python3
import random
TEAMS_PER_GROUP = 4
def gruppenfunktion(groups, gruppe_a, gruppe_b, gruppe_c, gruppe_d):
if len(gruppe_a) == TEAMS_PER_GROUP:
groups.remove("Group A")
if len(gruppe_b) == TEAMS_PER_GROUP:
groups.remove("Group B")
if len(gruppe_c) == TEAMS_PER_GROUP:
groups.remove("Group C")
if len(gruppe_d) == TEAMS_PER_GROUP:
groups.remove("Group D")
def main():
groups = ["Group A", "Group B", "Group C", "Group D"]
teams = [
"Astralis",
"Cloud 9",
"Complexity",
"Ence",
"Espada",
"FaZe Clan",
"Fnatic",
"Furia",
"G2 Esports",
"Mousesports",
"Na'Vi",
"Ninjas in Pyjamas",
"OG",
"Team Liquid",
"Team Vitality",
"Virtus Pro",
]
print(f"{len(teams)} teams are playing!")
gruppe_a = []
gruppe_b = []
gruppe_c = []
gruppe_d = []
while teams:
leader = teams.pop(random.randrange(len(teams)))
gruppe = random.choice(groups)
if gruppe == "Group A":
gruppenfunktion(groups, gruppe_a, gruppe_b, gruppe_c, gruppe_d)
gruppe_a.append(leader)
elif gruppe == "Group B":
gruppenfunktion(groups, gruppe_a, gruppe_b, gruppe_c, gruppe_d)
gruppe_b.append(leader)
elif gruppe == "Group C":
gruppenfunktion(groups, gruppe_a, gruppe_b, gruppe_c, gruppe_d)
gruppe_c.append(leader)
elif gruppe == "Group D":
gruppenfunktion(groups, gruppe_a, gruppe_b, gruppe_c, gruppe_d)
gruppe_d.append(leader)
else:
assert False, f"unexpexted group {gruppe!r}"
print(gruppe_a)
print(gruppe_b)
print(gruppe_c)
print(gruppe_d)
if __name__ == "__main__":
main()
Code: Alles auswählen
#!/usr/bin/env python3
import random
GROUP_COUNT = 4
def main():
teams = [
"Astralis",
"Cloud 9",
"Complexity",
"Ence",
"Espada",
"FaZe Clan",
"Fnatic",
"Furia",
"G2 Esports",
"Mousesports",
"Na'Vi",
"Ninjas in Pyjamas",
"OG",
"Team Liquid",
"Team Vitality",
"Virtus Pro",
]
print(f"{len(teams)} teams are playing!")
if len(teams) % GROUP_COUNT != 0:
print(f"Can't evenly divide {len(teams)} into {GROUP_COUNT} groups!")
return
random.shuffle(teams)
groups = [
teams[i : i + GROUP_COUNT] for i in range(0, len(teams), GROUP_COUNT)
]
for group in groups:
print(group)
if __name__ == "__main__":
main()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware