用Python做countif的好方法是什么

2024-06-16 05:59:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我目前最好的想法是:

sum(meets_condition(x) for x in my_list)

以及

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

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

第二个对我来说似乎更容易阅读,但它不同于任何形式。

有没有更好的建议?我遗漏了什么图书馆功能吗?


Tags: in列表forlenifmy方式成员
3条回答

第一个

sum(meets_condition(x) for x in my_list)

在我看来是完全可读的和Python式的。

如果你喜欢我喜欢的第二种方法

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)

相关问题 更多 >