1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| liste=(
('Jean', 'M'),
('Enzo', 'M'),
('Juliette', 'F'),
('Blanche', 'F'),
('Aurore', 'F'),
('Gabriel ', 'M'),
('Marc', 'M'),
('Manon', 'F'),
('Emma', 'F'),
('Ulysse', 'M'),
('Kevin', 'M'),
('Iris', 'F'),
('Jeremy', 'M'),
('Michel', 'M'),
('Noemie', 'F'),
('Axel', 'M'),
('Yanis', 'M'),
('Solene', 'F'),
('Alice', 'F'),
('Valerie', 'F'),
) # Pas besoin de liste quand un tuple suffit...
classes={}
import math
def ajoute_eleve(eleve, classes, *, ecart=4, limit=math.inf):
for (i, c) in enumerate(classes, 1):
key="classe_%d" % i
match eleve[1]:
case "M": parite="F"
case "F": parite="M"
case _: raise KeyError("Eleve [%s] genre [%s] incohérent" % (eleve[0], eleve[1]))
# match
if math.fabs(len(classes[key][eleve[1]]) - len(classes[key][parite])) < ecart\
and len(classes[key][eleve[1]]) + len(classes[key][parite]) < limit:
break
else:
# Toutes classes pleines (ou pas encore de classe): nouvelle classe...
key="classe_%d" % (len(classes) + 1)
classes[key]={"M" : list(), "F" : list()}
# for
# Choipeaumagique
classes[key][eleve[1]].append(eleve[0])
# ajoute_eleve()
for e in liste: ajoute_eleve(e, classes)
for (k, v) in classes.items():
print(k, v, len(v["M"]), len(v["F"])) |
Partager