代码之家  ›  专栏  ›  技术社区  ›  Gordon Wrigley

用python做countif的好方法是什么

  •  36
  • Gordon Wrigley  · 技术社区  · 14 年前

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

    我目前的最佳想法是:

    sum(meets_condition(x) for x in my_list)
    

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

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

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

    有人有更好的建议吗?有没有我找不到的图书馆功能?

    3 回复  |  直到 8 年前
        1
  •  48
  •   Ants Aasma    14 年前

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

    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)
    
        2
  •  11
  •   ChristopheD    14 年前

    第一个

    sum(meets_condition(x) for x in my_list)
    

    在我看来,这是一种可读性很强的蟒蛇。

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

    len(filter(meets_condition, my_list))
    

    另一种方法可能是:

    map(meets_condition, my_list).count(True)
    
        3
  •  1
  •   user3234931    10 年前

    列表的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)