2016-04-24 9 views
1

Ich habe ein Wörterbuch, das so aussieht. . .Den Durchschnitt bestimmter Werte in einem Wörterbuch finden

students_marks = {"barry": [20,25,30], "fred": [12,14,16], "sarah": [32,30,28] 

und so weiter, ich bin in der Lage, weitere Schlüssel mit Werten zum Wörterbuch hinzuzufügen. die Werte sind Markierungen für jede Zuordnung

Ich versuche, den Durchschnitt aller Studenten in der ersten Zuordnung z. barry - 20, Fred - 12, sarah - 32

dies ist mein Code so weit

students_marks = {"barry": [20,25,30], "fred": [12,14,16], "sarah": [32,30,28]} 

def get_below_average_df_report_marks_report(): 
    sum(float(x[0] for x in students_marks.values())/len(students_marks)) 

ich den Fehler bekommen: Typeerror: float() Argument muss eine Zeichenkette oder eine Zahl sein, nicht ‚Generator‘

Antwort

1

Das Problem ist, dass Sie versuchen, zu floaten, bevor die Summe zu berechnen, sollte es float(sum... statt sum(float... sein.

>>> float(sum(x[0] for x in students_marks.values()))/len(students_marks) 
21.333333333333332 

Soweit Lesbarkeit geht, ziehe ich diese Lösung:

>>> from operator import itemgetter 
>>> first_score = itemgetter(0) 
>>> num_students = float(len(students_marks)) 
>>> sum(map(first_score, students_marks.values()))/num_students 
21.333333333333332 

Wenn Sie eine Lösung ohne eine Import-Anweisung bevorzugen, wäre dies ein Äquivalent sein:

>>> first_score = lambda scores: scores[0] 
>>> num_students = float(len(students_marks)) 
>>> sum(map(first_score, students_marks.values()))/num_students 
21.333333333333332 

Beachten Sie, dass Wenn Sie Python 3 verwenden, sind die zu floatenden Umwandlungen unnötig, da der Operator / die Gleitkommadivision standardmäßig bereits ausführt.

0

Ihre float Besetzung ist veraltet:

def get_below_average_df_report_marks_report(): 
    sum((x[0] for x in students_marks.values())/len(students_marks) 

Sie versuchen, den Generator Objekt x[0] for x in students_marks.values() in einen Schwimmer zu konvertieren, was nicht möglich ist und Ihre Fehler verursacht hat.

Beachten Sie, dass Sie in Python 3 die Werte nicht zuerst in einen Gleitkommawert konvertieren müssen. Die Division gibt immer einen Gleitkommawert zurück. In Python 2 können Sie from __future__ import division verwenden, um dieses Verhalten zu erzwingen.