2017-10-12 6 views
-1

Ich erstelle eine Funktion, die ein Wörterbuch mit Schlüsseln und Werten aus verschiedenen Listen zurückgeben soll. Aber ich habe Probleme, den Mittelwert einer Liste von Zahlen als Werte des Wörterbuchs zu erhalten. Ich denke jedoch, dass ich die Schlüssel richtig bekomme. Das ist, was ich bisher bekommen:Wie Werte einem Wörterbuch zugewiesen werden

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]])) 

Die Ausgabe sollte:

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

Aber was ich erhalte immer 5 als Werte aller Schlüssel. Ich dachte über die zip() -Methode nach, aber ich versuche, sie zu vermeiden, weil sie in beiden Listen die gleiche Länge benötigt.

Antwort

0

Ein Durchschnitt einer Sequenz ist sum(sequence)/len(sequence), also müssen Sie sowohl magnitudes als auch measures durchlaufen, diese Mittel berechnen (arithmetische Mittelwerte) und in einem Wörterbuch speichern.

Es gibt viel mehr pythonische Möglichkeiten, die Sie erreichen können. Alle diese Beispiele ergeben {'mag1': 2.0, 'mag2': 3.5, 'mag3': 5.0} als Ergebnis.

Mit for i in range() Schleife:

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]])) 

Aber wenn Sie beide Indizes und Werte einer Liste benötigen, können Sie for i, val in enumerate(sequence) Ansatz verwenden, die viel besser geeignet ist in diesem Fall:

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]])) 

Ein weiteres Problem versteckt hier: i Index gehört zu magnitudes aber wir bekommen auch Werte von measures mit es, das ist keine große Sache in Ihrem Fall, wenn Sie magnitudes undhabendie gleiche Länge, aber wenn magnitudes größer sein wird, erhalten Sie eine IndexError. So scheint es mir, wie die Verwendung von zip Funktion ist, was wäre die beste Wahl hier (eigentlich wie von Python3.6 es nicht zwei Listen die gleiche Länge benötigen, wird es nur die Länge der kürzesten als die Länge von verwenden Ergebnis):

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]])) 

So fühlen sich frei um das Beispiel zu verwenden, die Ihre Anforderungen, von denen entsprechen, die Sie mögen und nicht vergessen docstring hinzuzufügen.

Wahrscheinlicher Sie nicht so pythonic Weg brauchen, aber es kann auch kürzer sein, wenn Wörterbuch Verständnis ins Spiel kommt:

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]])) 
Verwandte Themen