在Python中使用countif的好方法是什么?

时间:2010-04-15 08:47:58

标签: python

我想要计算迭代中有多少成员符合给定条件。我想以一种清晰简单的方式做到这一点,最好是相当合理的。

我目前最好的想法是:

sum(meets_condition(x) for x in my_list)

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

第一个基于迭代器的大型列表可能更快。它与您用于测试任何和所有的形式相同。但是它取决于int(True)== 1的事实,这有点难看。

第二个似乎更容易给我看,但它与任何和所有形式都不同。

有没有人有更好的建议?我错过了哪个库函数?

4 个答案:

答案 0 :(得分:49)

基于迭代器的方法很好。有一些细微的修改可以强调你在计算的事实:

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)

答案 1 :(得分:11)

第一个

sum(meets_condition(x) for x in my_list)

对我来说看起来非常易读和诡计。

如果您更喜欢第二种方法,我会选择

len(filter(meets_condition, my_list))

另一种方式可能是:

map(meets_condition, my_list).count(True)

答案 2 :(得分:1)

列表的标识

#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)

答案 3 :(得分:-1)

我知道上面的问题已经得到很好的解决,但是如果您是python世界的新手,并且碰巧出现在这里,是因为您搜索了简单的关键字“ Countif python”(而google则建议将此页面作为最列表中的相关页面),以下方法非常易于编写和运行。

您可以简单地使用布尔值,正如戈登所说,这取决于True == 1的事实;

首先,使用列的条件创建一个布尔序列,然后将这些值相加。

series = boolian condition
sum(series)

示例: 我们想知道有多少学生(GPA = A),有多少学生的数学成绩超过80分。

df = pd.DataFrame({'ID': [1,2,3,4,5],
               'Math':[87,83,95,75,60],
               'GPA': ['A','B','A','B','C']})

答案:

GPA = df.GPA == 'A'
sum(GPA)
Out: 2

Math_Mark = df.Math > 80
sum(Math_Mark)
Out: 3

P.s:我添加了此答案,因为当您搜索“ countif python”时,google将该页面列为最相关的页面。无需给出否定的答案,如果你们大多数人认为此答案不应该出现,我将其删除。