在Python中,我有一個像下面列出的清單:計算平均值Python中的列表,但不包括文字
[[1,2,3, 'L'], ['L'], [1]]
,我要計算每個子列表中的平均對所有的數字元素。值'L'應該被排除。上述示例的結果應該是:
[2, [], 1]
是否有任何快速方法可以在一行中執行此操作?
謝謝。
在Python中,我有一個像下面列出的清單:計算平均值Python中的列表,但不包括文字
[[1,2,3, 'L'], ['L'], [1]]
,我要計算每個子列表中的平均對所有的數字元素。值'L'應該被排除。上述示例的結果應該是:
[2, [], 1]
是否有任何快速方法可以在一行中執行此操作?
謝謝。
假設你已經輸入了numpy
和numbers
,這裏是一個非常難以理解的單線程。沒有數字元素的列表在結果列表中顯示爲nan
。
[numpy.mean([x for x in sublist if isinstance(x, numbers.Number)]) for sublist in mainlist]
+1。我喜歡你的單線式比我更好。 –
爲了得到你要的確切結果,我會做到這一點:
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
似乎更合適。
不是'如果len(過濾)'與'if filtered'一樣覆蓋相同的功能,這更簡潔嗎? –
@ sr2222:感謝您指出這一點! –
'return np.mean(filtered)if filtered else []' – wim
考慮:
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]]
非常醜陋的黑客,但它的作品。 – jamylak
你特別想要一條線,或只是最短的?我敢肯定,你不能在一行中這樣做,只是因爲你至少需要完成2到3個不同的高級操作。 –
儘可能短的作品!我只是想有一個更明智的方式來做這件事,而不是迭代每個子列表,檢查它是不是'L',遞增計數器和總和等。 –
爲什麼結果是'[2,[],1]'不是'[2,0,1]'? – Zoozy