2010-04-15 56 views
25

我想統計一個迭代器有多少個成員滿足給定的條件。我想以一種清楚簡單的方式來完成,最好是合理的。什麼是在Python中做countif的好方法

我目前最好的思路是:

sum(meets_condition(x) for x in my_list) 

len([x for x in my_list if meets_condition(x)]) 

基於第一個是迭代器大概是更快的大名單。它和你用來測試任何和所有東西的形式是一樣的。然而這取決於int(True)== 1,這有點難看。

第二個看起來比較容易閱讀,但它與任何形式和所有形式都不同。

有沒有人有更好的建議?有沒有一個庫函數我失蹤了?

回答

37

迭代器爲基礎的方法就好了。有跡象表明,可以強調的事實,你指望稍作修改:

sum(1 if meets_condition(x) else 0 for x in my_list) 
# or 
sum(1 for x in my_list if meets_condition(x)) 

和往常一樣,如果目的不是從代碼可以看出,在將其封裝描述性命名函數:

def count_matching(condition, seq): 
    """Returns the amount of items in seq that return true from condition""" 
    return sum(1 for item in seq if condition(item)) 

count_matching(meets_condition, my_list) 
8

第一個

sum(meets_condition(x) for x in my_list) 

看起來完全可讀和Python的我。

如果你喜歡第二種方法我會去

len(filter(meets_condition, my_list)) 

另一種方式可以是:

map(meets_condition, my_list).count(True) 
+1

地圖和過濾器似乎有利於列表內涵和發電機的這些天被皺起了眉頭 – 2010-04-15 09:20:21

+0

@tolomea:真(據瞭解,圭多不喜歡他們那麼多:看到http://www.artima.com/weblogs/viewpost.jsp?thread=98196),雖然目前只有'reduce'被安排去除。這就是說,正如在我的回答中,我認爲在這個特定情況下'sum(meet_condition(x)for my_list)'是最好的解決方案。 – ChristopheD 2010-04-15 09:29:28

+1

reduce並不是真的'計劃清除',它只是被移到了3.x中的functools模塊。 – 2010-04-15 09:52:48

0

COUNTIF爲列表

#counting if a number or string is in a list 
my_list=[1,2,3,2,3,1,1,1,1,1, "dave" , "dave"] 
one=sum(1 for item in my_list if item==(1)) 
two=sum(1 for item in my_list if item==(2)) 
three=sum(1 for item in my_list if item==(3)) 
dave=sum(1 for item in my_list if item==("dave")) 
print("number of one's in my_list > " , one) 
print("number of two's in my_list > " , two) 
print("number of three's in my_list > " , three) 
print("number of dave's in my_list > " , dave) 
相關問題