2012-10-20 18 views
5

mam słownika w formie:Średnia z krotki

{"a":(1, 0.1) , "b":(2, 0.2) , ...} 

Each nawiasach krotki (co odpowiada średniej, odchylenia standardowego). Jak wziąć średnią z pierwszej liczby całkowitej z każdej krotki? Próbowałem to:

for word in d: 
    (score, std) = d[word] 
    d[word]=float(score),float(std) 
    if word in string: 
     number = len(string) 
     v = sum(score) 
     return (v)/number 

Uzyskaj ten błąd:

v = sum(score) 
TypeError: 'int' object is not iterable 

Odpowiedz

7

Łatwo to zrobić za pomocą list comprehensions. Po pierwsze, możesz uzyskać wszystkie wartości słownika od d.values(). Aby utworzyć listę tylko pierwszego elementu każdej wartości, należy utworzyć listę taką jak [v[0] for v in d.values()]. Następnie, po prostu wziąć sumę tych elementów, i podzielić przez liczbę elementów w słowniku:

sum([v[0] for v in d.values()])/float(len(d)) 

Jak słusznie wskazuje Pedro, to faktycznie tworzy listę, a następnie robi sumę. Jeśli masz ogromny słownik, może to zająć sporo pamięci i być nieefektywnym, więc zamiast być zrozumiałym, potrzebujesz. W tym przypadku, to po prostu oznacza pozbycie się jednej pary wsporników:

sum(v[0] for v in d.values())/float(len(d)) 

Obie metody są porównywane in another question.

+2

W rzeczywistości nie potrzebujesz zrozumienia listy, "sum" będzie wymagało dowolnej iteracji, więc wyrażenie generatora w 'sum (v [0] dla v in d.values ​​())' będzie działać bez tworzenia listy pośredniej . –

+0

Doskonały punkt. Po prostu myślę, że budowanie takiego wyrażenia jest nieco jaśniejsze. – Mike