在Python中执行countif的好方法是什么

在Python中执行countif的好方法是什么,python,Python,我想计算一个iterable中有多少成员满足给定条件。我想用一种清晰简单的方式来做,最好是合理优化 我目前最好的想法是: sum(meets_condition(x) for x in my_list) 及 第一种是基于迭代器的,对于大列表来说可能更快。这和你用来测试任何东西的形式都一样。然而,这取决于int(True)==1这一事实,这有点难看 第二种对我来说似乎更容易理解,但它不同于任何形式 有谁有更好的建议吗?是否有我缺少的库函数?第一个 sum(meets_condition(x) f

我想计算一个iterable中有多少成员满足给定条件。我想用一种清晰简单的方式来做,最好是合理优化

我目前最好的想法是:

sum(meets_condition(x) for x in my_list)

第一种是基于迭代器的,对于大列表来说可能更快。这和你用来测试任何东西的形式都一样。然而,这取决于int(True)==1这一事实,这有点难看

第二种对我来说似乎更容易理解,但它不同于任何形式

有谁有更好的建议吗?是否有我缺少的库函数?

第一个

sum(meets_condition(x) for x in my_list)
在我看来,这本书可读性很好,很像蟒蛇

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

len(filter(meets_condition, my_list))
另一种方法可以是:

map(meets_condition, my_list).count(True)

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

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)
为列表计数

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

我知道上面的问题已经得到了很好的解决,但是如果你是python世界的新手,碰巧在这里是因为你搜索了简单的关键字“Countif python”(谷歌建议这个页面是列表中最相关的页面),那么下面的方法编码和运行起来非常简单

您可以简单地使用布尔值,正如Gordon所说,这取决于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

补充:我添加了这个答案,因为当你搜索“countif python”时,谷歌将这个页面列为最相关的页面。不需要否定,如果你们中的大多数人认为这个答案不应该在这里,我会删除它

如今,地图和过滤器似乎不赞成列表的理解和过滤generators@tolomea:true(众所周知Guido不太喜欢它们:请参阅),尽管目前只有
reduce
计划删除。话虽如此,在我的回答中,我认为
sum(满足我列表中x的条件(x))
是这个特定情况下的最佳解决方案。reduce并不是真正的“预定删除”,它只是被移到了3.x中的functools模块中。@Thomas Wouters:没错,这是一个好的观点。从内置项中删除会更好。在Python中,根据定义,True==1,因此在许多情况下,您可以编写
sum(…条件…for x in FOO)
sum(map(some_谓词,FOO))
GPA = df.GPA == 'A'
sum(GPA)
Out: 2

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