2017-10-12 4 views
-1

Je crée une fonction censée renvoyer un dictionnaire avec des clés et des valeurs provenant de différentes listes. Mais j'ai des problèmes pour obtenir la moyenne d'une liste de nombres en tant que valeurs du dictionnaire. Cependant, je pense que je reçois les clés correctement. Ce est ce que je reçois jusqu'à présent:Comment associer des valeurs à un dictionnaire

def exp (magnitudes,measures): 
    """return for each magnitude the associated mean of numbers from a list""" 
dict_expe = {} 
for mag in magnitudes: 
    dict_expe[mag] = 0 
    for mea in measures: 
     summ = 0 
    for n in mea: 
     summ += n 
     dict_expe[mag] = summ/len(mea) 


     return dict_expe 

print(exp(['mag1', 'mag2', 'mag3'], [[1,2,3],[3,4],[5]])) 

La sortie doit être:

{mag1 : 2, mag2: 3.5, mag3: 5} 

Mais ce que je reçois est toujours 5 en tant que valeurs de toutes les clés. Je pensais à la méthode zip() mais j'essayais de l'éviter parce que le requiers requérait la même longueur dans les deux listes.

Répondre

0

Une moyenne d'une séquence est sum(sequence)/len(sequence), donc vous devez itérer les deux magnitudes et measures, le calcul de ces moyens (moyennes arithmétiques) et le stocker dans un dictionnaire.

Il y a beaucoup plus de façons pythoniques de réaliser cela. Tous ces exemples produisent {'mag1': 2.0, 'mag2': 3.5, 'mag3': 5.0} comme résultat.

En utilisant la boucle for i in range():

def exp(magnitudes, measures): 
    means = {} 
    for i in range(len(magnitudes)): 
     means[magnitudes[i]] = sum(measures[i])/len(measures[i]) 
    return means 

print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]])) 

Mais si vous avez besoin des deux indices et les valeurs d'une liste que vous pouvez utiliser l'approche for i, val in enumerate(sequence) qui est beaucoup plus approprié dans ce cas:

def exp(magnitudes, measures): 
    means = {} 
    for i, mag in enumerate(magnitudes): 
     means[mag] = sum(measures[i])/len(measures[i]) 
    return means 

print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]])) 

Une autre cache problème ici: i index appartient à magnitudes mais nous obtenons également des valeurs de measures en l'utilisant, ce n'est pas une grosse affaire dans votre cas si vous avez magnitudes et measures la même longueur, mais si magnitudes sera plus grande, vous obtiendrez un IndexError. Donc, il me semble que l'utilisation zip fonction est ce qui serait le meilleur choix ici (en fait, à partir de python3.6, il ne nécessite pas deux listes pour être de la même longueur, il utilisera simplement la longueur du plus court comme la longueur de résultat):

def exp(magnitudes, measures): 
    means = {} 
    for mag, mes in zip(magnitudes, measures): 
     means[mag] = sum(mes)/len(mes) 
    return means 

print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]])) 

se sentent donc libre d'utiliser l'exemple qui convient à vos besoins de celui que vous aimez et ne pas oublier d'ajouter docstring.

Plus probable que vous n'avez pas besoin tels pythonique façon mais il peut être encore plus court quand compréhension du dictionnaire entre en jeu:

def exp(magnitudes, measures): 
    return {mag: sum(mes)/len(mes) for mag, mes in zip(magnitudes, measures)} 

print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]]))