2014-01-28 32 views
2

我想知道是否有做以下的更簡潔的方法:建議改變功能在地圖上表達

htr是numpy的陣列,我要做到以下幾點:

hL, tL, rL = map(lambda m: len(set(m)), [h, t, r]) 

它計算單個數組中非重複項的數量。然而,lambda表達式像拇指一樣突出。如果不重複的東西沒有問題,我會寫:

hL, tL, rL = map(len, [h, t, r]) 

這是太酷了。我們完全分配了lambda表達式。在Haskell已經涉足了幾個月,我真的開始相信了Python應該能夠提供一個鏈接操作就像在Haskell .,這樣,第一個表達式可以簡單地歸納爲以下:

hL, tL, rL = map(len . set, [h, t, r]) 

哪個好多了!

我看到了一些使用reduce方法來做到這一點,但這比以前的方法簡單得多。我想知道有沒有人知道他們可以解決問題?我知道有非嚴格評估的問題,可能使程序不穩定,但是當我們正在處理這樣的簡單事情時,這應該不是一個問題?

回答

3

Python不提供組合運算符。

如何使用list comprehension

>>> h = [1,2,3] 
>>> t = [1,1,1,1] 
>>> r = [1,2,2,1] 
>>> hL, tL, rL = [len(set(m)) for m in h, t, r] 
>>> hL, tL, rL 
(3, 1, 2) 
+0

實際上看起來更好。謝謝! – ssm

4

爲了計算獨特元件在numpy的陣列的數量時,可以使用unique(x).sizelen(unique(x))(見numpy.unique)。如果你真的想使三個長度「一班輪」的計算,你可以寫:

hL, tL, rL = [len(unique(x)) for x in h, t, r] 

如果它的事項:適用於中,大型陣列,unique(x)可以比set(x)快了很多,但對於小陣列,set(x)更快。 (我還沒有探索過大範圍的數組和大小的數據類型的性能,所以我會留下「大」和「小」的未定義。請自己測試 - 但僅限於此代碼是性能瓶頸。)

+0

我很喜歡這個答覆謝謝! – ssm