2011-10-04 94 views
2

这是一个开始滚雪球前一个问题的一个分支。如果我有一个矩阵A,我想用均值/平均每行的[1:]值创建另一个矩阵B,但保持行标题完整,我会怎么做呢?我已经包括矩阵A,我试图在一起列出理解,并且期望的结果。矩阵列表理解的意思是

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] 

预期结果

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

这些事情之一是不喜欢别人。为什么数据不在字典中? '{ '苹果' :(0.95,0.99,0.89,0.87,0.93),...}'' –

+0

(A [0],和,A [1:]/LEN,A [1:])'应读'(A [0],和(A [1:])/ LEN(A [1:]))'。 'sum'和'len'是功能! – Eric

回答

5

你的列表中理解显得有些怪异。您正在为迭代和项目使用相同的变量。

这种做法似乎工作:

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

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

我已经创造了可读性功能average。它符合你的预期值,所以我认为这就是你想要的,尽管你使用mul表明我可能会错过一些东西。

+0

有没有办法简单地将平均函数嵌入到理解代码本身中,而不必担心定义?看起来会更简单。我使用mul是一个错误,我的意思是总结。 – Jeff

+0

我很欣赏你的解决方案,但我是一个简单的人。 – Jeff

+1

@Jeff:*不包括列表理解中的'average()'计算是很简单的。 – Johnsyweb

1

从@recursive和@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}]