2015-03-03 3 views
2

Comment faire référence aux premier, deuxième et troisième éléments d'une liste affectée à une clé dans un dictionnaire? Le dictionnaire est un nom d'étudiant avec une liste qui lui est assignée avec ses scores. Comment puis-je faire référence à chacun des scores de cette liste pour pouvoir retirer le plus petit, et plus tard calculer une moyenne à partir de ces scores et les imprimer . Le dictionnaire ressemble à ceTri des données dans les dictionnaires par numéro le plus élevé dans une liste affectée en tant que valeur? python

{'Student Example ': [5, 2], 'Student Name ': [2], 'Another Student ': [1]} 

alors que le code im essayant d'utiliser ressemble

viewscores = input ("Would you like to view the scoreboards? (Yes/No): ") 
if viewscores == "Yes": 
    classview = int (input ("What class board would you like to view? (1,2 or 3): ")) 
    print ("Sort class",classn,"scoreboard: ") 
    print ("1. Alphabetically by students highscore") 
    print ("2. By high score, highest to lowest") 
    print ("3. By average score, highest to lowest") 
    sorting = int (input("Enter sort type: (1,2 or 3): ")) 

    if classview == 1: 
     if sorting == 1: 
      highscores = ((k, classone[k]) for k in sorted(classone, key=classone.get, reverse=True)) 
      for k, v in highscores: 
       listnum = len(v) 
       while listnum > 1: 
        if (v[1]) < (v[0]): 
         del (v[1]) 
       print (v,k) 

Je reçois l'erreur:

Traceback (most recent call last): 
    File "C:\Users\emily_000\Desktop\test task 3 part two.py", line 116, in <module> 
    if (v[1]) < (v[0]): 
IndexError: list index out of range 

Comment pourrais-je faire référence aux indexs du listes de sorte que je peux trouver le meilleur score sur eux, puis trier (par le plus élevé au plus bas, et par ordre alphabétique). Alors comment pourrais-je me référer à eux pour que je puisse calculer une moyenne sur les scores et organiser par ce nombre? en utilisant python

3.3.4

Ceci est pour un projet scolaire Pourriez-vous expliquer comment cela fonctionne, donc je peux comprendre, je vous remercie pour toute aide

+0

Sur quelle ligne est l'erreur? Pouvez-vous réduire le problème à quelques lignes de code? –

+0

Je reçois un 'Traceback (dernier appel en dernier): Fichier "C: \ Utilisateurs \ georg_000 \ Bureau \ tâche de test 3 partie two.py", ligne 116, en si (v [1]) <(v [0]): IndexError: indice de liste hors plage 'erreur –

+0

Le problème est que vous ne mettez pas à jour 'listnum' lorsque vous supprimez un élément. Vous feriez probablement mieux de simplement utiliser 'len (v)' à sa place pour votre condition de boucle. – Ken

Répondre

1

Quant à votre première question:

averagescores = {} 
for k, v in highscores.items(): 
    averagescores[k] = float(sum(v))/float(len(v)) 

Le code ci-dessus fera la moyenne de tous les scores et les mettra dans un nouveau dictionnaire appelé «moyennescores». Pour votre deuxième question, les dictionnaires par défaut sont . Vous pouvez, cependant, obtenir une représentation ordonnée du dictionnaire comme tuples:

import operator 
sortedscores = sorted(averagescores.items(), key=operator.itemgetter(1)) 

Ce triera les scores du moins au plus en valeur.

+0

Merci pour la réponse! mais j'ai reçu cette erreur en utilisant le code moyen, pourquoi cela pourrait-il être? Traceback (dernier appel en dernier): Fichier "C: \ Utilisateurs \ georg_000 \ Bureau \ tâche de test 3 partie two.py", ligne 121, en moyennes [v] = somme (v)/len (v) TypeError: type non modifiable: 'list' –

+0

Oups! averagescores [v] devrait être moyennescores [k]. Corriger maintenant. – aborsim

+0

Après la correction, mon code montre toujours '[5, 4] Georgia Steele [2] Student Name [1] Un autre étudiant' qui a les deux éléments de la liste 'un moyenné', à moi 'v' fait plus de sens alors k, pouvez-vous savoir pourquoi il n'a pas travaillé cette fois? –