2011-10-04 3 views
2

Ceci est une émanation d'une question précédente qui a commencé à faire boule de neige. Si j'ai une matrice A et que je veux utiliser la moyenne/moyenne de chaque ligne [1:] valeurs pour créer une autre matrice B, mais garder les en-têtes de ligne intacts, comment ferais-je cela? J'ai inclus la matrice A, ma tentative de concocter une compréhension de liste et le résultat attendu.matrice liste compréhension moyenne

from operator import sum,len 

# matrix A with row headings and values 
A = [('Apple',0.95,0.99,0.89,0.87,0.93), 
('Bear',0.33,0.25.0.85,0.44,0.33), 
('Crab',0.55,0.55,0.10,0.43,0.22)] 

#List Comprehension 
B = [(A[0],sum,A[1:]/len,A[1:]) for A in A] 

Résultats attendus

B = [('Apple', 0.926), ('Bear', 0.44), ('Crab', 0.37)] 
+2

Une de ces choses est pas comme les autres. Pourquoi ces données ne sont-elles pas dans un dictionnaire? '{'APPLE' :(0.95,0.99,0.89,0.87,0.93), ...}' –

+0

'(A [0], somme, A [1:]/len, A [1:])' devrait lire '(A [0], somme (A [1:])/len (A [1:]))'. 'sum' et' len' sont des fonctions! – Eric

Répondre

5

Votre compréhension de la liste ressemble un peu bizarre. Vous utilisez la même variable pour l'itérable et l'élément.

Cette approche semble fonctionner:

def average(lst): 
    return sum(lst)/len(lst) 

B = [(a[0], average(a[1:])) for a in A] 

J'ai créé une fonction average pour une meilleure lisibilité. Il correspond à vos valeurs attendues, donc je pense que c'est ce que vous voulez, bien que votre utilisation de mul suggère que je puisse manquer quelque chose.

+0

N'y a-t-il aucun moyen d'intégrer simplement la fonction moyenne dans le code de compréhension lui-même sans se soucier des définitions? Il semble que ce serait plus simple. Mon utilisation de mul était une erreur, je voulais dire la somme. – Jeff

+0

J'apprécie votre solution, mais je suis un gars simple. – Jeff

+1

@Jeff: * Not * incluant le calcul 'average()' dans la compréhension de la liste * est * simple. – Johnsyweb

1

Prise de @recursive et @Steven Rumbalski:

>>> def average(lst): 
...  return sum(lst)/len(lst) 
... 
>>> A = { 
...  'Apple': (0.95, 0.99, 0.89, 0.87, 0.93), 
...  'Bear': (0.33, 0.25, 0.85, 0.44, 0.33), 
...  'Crab': (0.55, 0.55, 0.10, 0.43, 0.22), 
... } 
>>> 
>>> B = [{key: average(values)} for key, values in A.iteritems()] 
>>> B 
[{'Apple': 0.92599999999999993}, {'Bear': 0.44000000000000006}, {'Crab': 0.37}]