我有一個整數列表,我需要計算它們中有多少個> 0.
我目前正在做一個列表解析,看起來像這樣:使用Python列表解析計算列表中的正整數元素
sum([1 for x in frequencies if x > 0])
這似乎是一個體面的理解,但我不喜歡「1」;它似乎有點神奇的數字。有沒有更Pythonish的方式來做到這一點?
我有一個整數列表,我需要計算它們中有多少個> 0.
我目前正在做一個列表解析,看起來像這樣:使用Python列表解析計算列表中的正整數元素
sum([1 for x in frequencies if x > 0])
這似乎是一個體面的理解,但我不喜歡「1」;它似乎有點神奇的數字。有沒有更Pythonish的方式來做到這一點?
如果你想減少內存量,就可以避免使用發電機產生的臨時列表:
sum(x > 0 for x in frequencies)
這工作,因爲bool
是int
一個子類:
>>> isinstance(True,int)
True
True
的值爲1:
>>> True==1
True
然而,正如Joe Golton在評論中指出的那樣,這種解決方案並不是非常快。如果您有足夠的內存來使用中間臨時列表,則sth's solution可能會更快。下面是一些比較計時的各種解決方案:
>>> frequencies = [random.randint(0,2) for i in range(10**5)]
>>> %timeit len([x for x in frequencies if x > 0]) # sth
100 loops, best of 3: 3.93 ms per loop
>>> %timeit sum([1 for x in frequencies if x > 0])
100 loops, best of 3: 4.45 ms per loop
>>> %timeit sum(1 for x in frequencies if x > 0)
100 loops, best of 3: 6.17 ms per loop
>>> %timeit sum(x > 0 for x in frequencies)
100 loops, best of 3: 8.57 ms per loop
謹防timeit結果可能取決於Python的,操作系統或硬件的版本而異。
當然,如果你是數字的大名單上做數學,你或許應該使用NumPy的:
>>> frequencies = np.random.randint(3, size=10**5)
>>> %timeit (frequencies > 0).sum()
1000 loops, best of 3: 669 us per loop
的NumPy的陣列需要比同等的Python列表較少的內存,並且可以進行計算表現比任何純Python解決方案都快得多。
變化:[x> 0 for x in頻率] .count( True) – 2010-05-24 20:38:08
@Peter:注意你的建議在數據上循環兩次;一次構建輸出列表,兩次計算真值。 – tzot 2010-06-24 19:16:57
@ΤΖΩΤΖΙΟΥ:是的,當然,感謝您的信息! – 2010-06-24 19:20:20
你可以過濾列表上使用len()
:
len([x for x in frequencies if x > 0])
甚至更好,使用發電機(帶[和]) – 2010-05-24 20:34:11
您可以使用此過濾器使其看起來更清晰。 len(filter(lambda x:x> 0,頻率)) – 2010-05-24 20:35:22
@valya:這對於一個生成器不起作用 – sth 2010-05-24 20:50:38
這個怎麼樣?
reduce(lambda x, y: x+1 if y > 0 else x, frequencies)
編輯: 與接受答案的靈感來自@〜unutbu:
reduce(lambda x, y: x + (y > 0), frequencies)
我希望我得到了一個評論,用那個投票去學習我的錯誤。請? – 2010-05-24 20:39:50
似乎有一種從lambda函數轉向列表解析的趨勢。 – fairfieldt 2010-05-28 23:31:44
我不是一個讓你失望的人;然而我會認爲人們傾向於「減少」,它被淘汰等(由Guido宣言)。我喜歡'reduce',但是在這種情況下我也不喜歡它的使用,因爲'sum(x> 0 ...)'變體對我來說似乎更直接。 – tzot 2010-06-24 19:20:55
如果數組僅包含大於等於0的元素(即,所有的元素都是0或正整數),那麼你可以只計數零和減去該號碼形成陣列的長度:
len(arr) - arr.count(0)
計數非零元素是不一樣的計數元件> 0的標題應相應修改 – joaquin 2010-05-24 20:51:23
我更新了問題的標題,以便它反映其內容。我希望這對你很好。 – EOL 2010-05-26 07:28:13