【问题标题】:What is a good way to do countif in Python什么是在 Python 中做 countif 的好方法
【发布时间】:2020-06-20 23:27:14
【问题描述】:

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

我目前最好的想法是:

sum(meets_condition(x) for x in my_list)

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

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

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

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

【问题讨论】:

    标签: python


    【解决方案1】:

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

    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)
    

    【讨论】:

    • True == 1 在 Python 中的定义,所以在很多情况下你可以写成 sum(...condition... for x in FOO)sum(map(some_predicate, FOO))
    【解决方案2】:

    第一个

    sum(meets_condition(x) for x in my_list)
    

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

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

    len(filter(meets_condition, my_list))
    

    另一种方式可能是:

    map(meets_condition, my_list).count(True)
    

    【讨论】:

    • 地图和过滤器这些天似乎不赞成列表理解和生成器
    • @tolomea: true(众所周知,Guido 不太喜欢它们:请参阅 artima.com/weblogs/viewpost.jsp?thread=98196)虽然目前只有 reduce 计划被移除。话虽如此,就像我的回答一样,我认为sum(meets_condition(x) for x in my_list) 是这种特定情况下的最佳解决方案。
    • reduce 并不是真正的“计划删除”,它只是在 3.x 中被移至 functools 模块。
    • @Thomas Wouters:没错,说得好。从内置函数中删除会更好。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我知道上面的问题已经很好地解决了,但是如果你是 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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 2010-10-16
        • 1970-01-01
        • 2014-04-12
        相关资源
        最近更新 更多