2012-10-20 10 views
5

ho un dizionario nella forma:medio di tuple

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

Ogni parentesi è una tupla corrispondente a (punteggio, deviazione standard). Come posso prendere la media del solo primo numero in ogni tupla? Ho provato questo:

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 

ottengo questo errore:

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

risposta

7

E 'facile da fare usando list comprehensions. Innanzitutto, è possibile ottenere tutti i valori del dizionario da d.values(). Per creare un elenco di solo il primo elemento di ciascun valore, fai una lista come [v[0] for v in d.values()]. Poi, basta prendere la somma di questi elementi, e dividere per il numero di elementi nel dizionario:

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

Come Pedro giustamente sottolineato, questo in realtà crea la lista, e poi fa la somma. Se si dispone di un enorme dizionario, questo potrebbe richiedere un po 'di memoria ed essere inefficiente, quindi si vorrebbe un generator expression invece di una comprensione di lista. In questo caso, che proprio significa liberarsi di un paio di parentesi:

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

I due metodi sono confrontati in another question.

+2

In realtà non è necessario il list comprehension, 'sum' prenderà qualsiasi iterabile, quindi l'espressione del generatore in' sum (v [0] per v in d.values ​​()) 'funzionerà senza creare l'elenco intermedio . –

+0

Punto eccellente. Penso solo che costruire l'espressione come questa sia un po 'più chiara. – Mike