2011-10-04 64 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}]