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

Gor*_*ley 39 python

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

我目前最好的想法是:

sum(meets_condition(x) for x in my_list)
Run Code Online (Sandbox Code Playgroud)

len([x for x in my_list if meets_condition(x)])
Run Code Online (Sandbox Code Playgroud)

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

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

有没有人有更好的建议?我遗失的地方有图书馆功能吗?

Ant*_*sma 52

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

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))
Run Code Online (Sandbox Code Playgroud)

和往常一样,如果代码中的意图不明显,请将其封装在描述性命名的函数中:

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)
Run Code Online (Sandbox Code Playgroud)

  • 根据 Python 中的定义,True == 1,因此在许多情况下,您可以编写 `sum(...condition... for x in FOO)` 或 `sum(map(some_predicate, FOO))`。 (2认同)

Chr*_*heD 13

第一个

sum(meets_condition(x) for x in my_list)
Run Code Online (Sandbox Code Playgroud)

看起来非常可读和pythonic对我来说.

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

len(filter(meets_condition, my_list))
Run Code Online (Sandbox Code Playgroud)

另一种方式可能是:

map(meets_condition, my_list).count(True)
Run Code Online (Sandbox Code Playgroud)