Python - l'élève devient le professeur - 9. comment tout le monde s'en sort


#1



Après avoir refais l'exercice 2 fois, consulté les forums, je n'arrive pas à gérer le problème. Le message d'erreur est (dans la console) :
"B
Traceback (most recent call last):
File "python", line 64, in
File "python", line 54, in calcule_classe_moyenne
File "python", line 30, in calcule_moyenne
TypeError: list indices must be integers, not str
"

Quand je fais appel à un seul élément et non une liste, le code fonctionne, lorsque je fais un print results, j'obtiens des "none" dans la liste que ne sais pas non plus gérer la fonction moyenne... Suis tout neuf en code, et là, suis un peu perdu...

Merci d'avance pour vos corrections/commentaires.

lloyd = {
    "noms": "Lloyd",
    "devoirs": [90.0, 97.0, 75.0, 92.0],
    "quiz": [88.0, 40.0, 94.0],
    "tests": [75.0, 90.0]
}
alice = {
    "noms": "Alice",
    "devoirs": [100.0, 92.0, 98.0, 100.0],
    "quiz": [82.0, 83.0, 91.0],
    "tests": [89.0, 97.0]
}
tyler = {
    "noms": "Tyler",
    "devoirs": [0.0, 87.0, 75.0, 22.0],
    "quiz": [0.0, 75.0, 78.0],
    "tests": [100.0, 100.0]
}

# Ajoutez votre fonction ci-dessous !
# En mode simple sans boucle
def moyenne(nombres):
    total = sum(nombres)
    total = float(total)
    return total / len(nombres)
    
# idem moyenne, au plus simple mais reste la question
# de la prise d'un dictionnaire pour les calculs
def calcule_moyenne(etudiant):
    devoirs = moyenne(etudiant["devoirs"])
    quiz = moyenne(etudiant["quiz"])
    tests = moyenne(etudiant["tests"])
    return .1*devoirs + .3*quiz + .6*tests
    
# association d'une lettre à un niveau de note
def ecrire_lettre_note(note):
    if note >= 90:
        return "A"
    elif note >= 80:
        return "B"
    elif note >= 70:
        return "C"
    elif note >= 60:
        return "D"
    else:
        return "F"

print ecrire_lettre_note(calcule_moyenne(lloyd))

# calcul de la moyenne de la classe
def calcule_classe_moyenne(etudiants):
    resultats = []
    for etudiant in etudiants:
        resultats.append(calcule_moyenne(etudiants))
    return moyenne(resultats)

# ajout suite message d'erreur à la correction auto
calcul_classe_moyenne=calcule_classe_moyenne

# il faut préciser la liste étudiants
etudiants = [lloyd, alice, tyler]

# appel de la fonction sachant qu'étudiants est une liste
print calcule_classe_moyenne(etudiants)
# appel de la fonction qui doit prendre un nombre en entrée
print ecrire_lettre_note(calcule_classe_moyenne(etudiants))


#2

Problème réglé, j'ai effectué les modifications suivantes :
- dans "calcule_classe_moyenne", j'ai remplacé "etudiants" par "etudiant" dans "resultats.append(....)"
- j'ai défini une variable égale à calcule_classe_moyenne(etudiants)
- j'ai fait print de cette variable puis print ecrire_lettreçnote de cette variable

Merci