2012-05-24 174 views
1

在Python中,我有一個像下面列出的清單:計算平均值Python中的列表,但不包括文字

[[1,2,3, 'L'], ['L'], [1]] 

,我要計算每個子列表中的平均對所有的數字元素。值'L'應該被排除。上述示例的結果應該是:

[2, [], 1] 

是否有任何快速方法可以在一行中執行此操作?

謝謝。

+1

你特別想要一條線,或只是最短的?我敢肯定,你不能在一行中這樣做,只是因爲你至少需要完成2到3個不同的高級操作。 –

+0

儘可能短的作品!我只是想有一個更明智的方式來做這件事,而不是迭代每個子列表,檢查它是不是'L',遞增計數器和總和等。 –

+3

爲什麼結果是'[2,[],1]'不是'[2,0,1]'? – Zoozy

回答

5

假設你已經輸入了numpynumbers,這裏是一個非常難以理解的單線程。沒有數字元素的列表在結果列表中顯示爲nan

[numpy.mean([x for x in sublist if isinstance(x, numbers.Number)]) for sublist in mainlist] 
+0

+1。我喜歡你的單線式比我更好。 –

11

爲了得到你要的確切結果,我會做到這一點:

from __future__ import division 
import numbers 
def average_over_numeric_values(a): 
    filtered = [x for x in a if isinstance(x, numbers.Number)] 
    if filtered: 
     return sum(filtered)/len(filtered) 
    return [] 
print(map(average_over_numeric_values, list_of_lists)) 

這不正是一個班輪,而是一個相當可讀的方式。

就個人而言,如果列表中沒有空值,我不會使用[] - None似乎更合適。

+2

不是'如果len(過濾)'與'if filtered'一樣覆蓋相同的功能,這更簡潔嗎? –

+0

@ sr2222:感謝您指出這一點! –

+2

'return np.mean(filtered)if filtered else []' – wim

1

考慮:

x = [[1,2,3, 'L'], ['L'], [1]] 

如果你必須有一個班輪:

[sum(w)/float(len(w)) if w else w for w in [[z for z in y if isinstance(z, numbers.Number)] for y in x]] 
+0

非常醜陋的黑客,但它的作品。 – jamylak