2016-04-23 19 views
0

EDIT:in einer Liste von Werten finden Average

Dies ist kein Duplikat ist zu finden, Durchschnittswert einer Liste weil diese Liste ein Wert ist, der mit einem Schlüssel zugeordnet ist.

Hatte das für diejenigen aufräumen, die es nicht bekommen haben.

Ich habe ein Wörterbuch, in dem jeder Schlüssel eine Liste/mehrere Werte hat:

'Jimin ': ['0', '0', '0', '0', '0', '0'], 'Jin': ['1', '0'], 

ich für jeden Schlüssel zB aus dem Durchschnitt der Werte drucken möchten:

'Jimin ':[0], 'Jin': [0.5], 

Ich habe bereits versucht:

avgDict = {} 
for k,v in StudentGrades.items(): 
    # v is the list of grades for student k 
    avgDict[k] = sum(v)/ float(len(v)) 

Aber ich erhalte den Fehlercode:

TypeError: unsupported operand type(s) for +: 'int' and 'str' 

Und ich habe auch versucht:

for names, scores in class1.items(): 
    print("{} : {}".format(names, mean(scores)) 

Aber ich erhalte den Fehlercode:

Traceback (most recent call last): 
File "C:/Users/Onyeka/Documents/Onyeka/Computer Science/Controlled   ` Assessment/Programming Project/task3.py", line 68, in <module>` 
print("{} : {}".format(names, mean(scores))) 
File "C:\Python34\lib\statistics.py", line 331, in mean 
T, total, count = _sum(data) 
File "C:\Python34\lib\statistics.py", line 161, in _sum 
for n,d in map(_exact_ratio, values): 
File "C:\Python34\lib\statistics.py", line 247, in _exact_ratio 
raise TypeError(msg.format(type(x).__name__)) 
TypeError: can't convert type 'str' to numerator/denominator 
+0

@Bahrom Es ist nicht – Agent007

Antwort

0

Ein weiterer Ansatz, um Ihre avg Funktion zu definieren ist und haben es während der Erstellung Ihres neuen Wörterbuch mit Wörterbuch Verständnis, so genannt:

>>> d = {'Jimin': ['0', '0', '0', '0', '0', '0'], 'Jin': ['1', '0']} 
>>> 
>>> def avg(lst): 
     return sum(map(float,lst))/len(lst) 

>>> {k:avg(v) for k,v in d.items()} 
{'Jin': 0.5, 'Jimin': 0.0} 

EDIT:

Was hast du da als Fehlermeldung auf die Tatsache zurückzuführen ist, dass Ihre Objekte in der Liste Werte sind string, so dass Sie ca eingeben müssen st sie zu int vor der arithmetischen Operation, deshalb sehen Sie auf dieser Lösung: map(float, lst), die jedes Element der Liste von string in float umwandelt.

EDIT2:

Wenn alles, was Sie wollen, ist mittelt zu drucken, dann wird folgendes tun:

>>> for k,v in d.items(): 
     print('{0} : {1}'.format(k,avg(v))) 


Jin : 0.5 
Jimin : 0.0 
1
>>> x = {'Jimin ': ['0', '0', '0', '0', '0', '0'], 'Jin': ['1', '0']} 
>>> {k: sum(int(i) for i in v)/float(len(v)) for k, v in x.items()} 
{'Jimin ': 0.0, 'Jin': 0.5} 

Aber wenn Sie die durchschnittliche in einer Liste:

>>> x = {'Jimin ': ['0', '0', '0', '0', '0', '0'], 'Jin': ['1', '0']} 
>>> {k: [sum(int(i) for i in v)/float(len(v))] for k, v in x.items()} 
{'Jimin ': [0.0], 'Jin': [0.5]} 

Oder, Sie können direkt zu float konvertieren und dann float(len(v)) brauchen Sie nicht:

>>> x = {'Jimin ': ['0', '0', '0', '0', '0', '0'], 'Jin': ['1', '0']} 
>>> {k: [sum(float(i) for i in v)/len(v)] for k, v in x.items()} 
{'Jimin ': [0.0], 'Jin': [0.5]} 
+0

I unter Verwendung versucht: {k: [sum (float (i) für i in v)/len (v)] für k, v in x.items()}, aber wie würde ich das schreiben? Meine IDE erlaubt es nicht. Außerdem haben Sie nicht deutlich gemacht, wie Sie die Mittelwerte mit den Namen drucken. – Agent007

+0

'>>>' Zeichen bedeutet, dass ich dir zeige, wie würdest du es in der Konsole schreiben. Es ist eine Konsolen-Eingabeaufforderung. Und ich habe nicht klargestellt, wie man "druckt", weil ich annahm, dass man die Grundlagen kennen würde, was meiner Meinung nach nicht der Fall ist. Sie könnten einfach 'print ({k: [Summe (float (i) für i in v)/len (v)] für k, v in x.items()})' verwenden. – AKS

+0

Könnten Sie bitte diesen Code erklären? Danke – Agent007

0

Der Grund Ihre erste Ansatz nicht funktioniert, ist, dass Sie die Qualitäten als Liste speichern der Schnur. Ein Weg, um Ihren Code zum Laufen zu bringen, wäre, die Zeichenfolgen in Zahlen zu konvertieren, bevor Sie sie mit der Funktion int zum Wörterbuch hinzufügen.

Also dieser Code

 if class1.get(names): 
      class1[names].append(scores) 
     else: 
      class1[names] = list(scores) 

würde dies geworden:

 if class1.get(names): 
      class1[names].append(int(scores)) 
     else: 
      class1[names] = list(int(scores)) 
0

Sie könnten den Mittelwert() -Methode des Statistikmodul verwenden:

Code:

from statistics import mean 

A = {'Jimin': [1,2,3], 'Jin': [1,2,3]} 

for key in A.keys(): 
    A[key] = mean(A.get(key)) 

Dies ergibt:

A = {'Jimin': 2.0, 'Jin': 2.0} 
+0

10 funktioniert nicht, ich bekomme den gleichen Fehler wie mein zweiter Fehlerblock – Agent007

Verwandte Themen