【问题标题】:Count how many values in a list that satisfy certain condition计算列表中有多少满足特定条件的值
【发布时间】:2014-05-19 05:19:06
【问题描述】:

我有以下列表,

mylist = ['0.976850566018849',
 '1.01711066941038',
 '0.95545901267938',
 '1.13665822176679',
 '1.21770587184811',
 '1.12567451365206',
 '1.18041077035567',
 '1.13799827821001',
 '1.1624485106005',
 '1.37823533969271',
 '1.39598077584722',
 '1.23844320976322',
 '1.57397155911713',
 '1.40605782943842',
 '1.36037525085048',
 '1.185',
 '1.22795283469963',
 '1.17192311574904',
 '1.04121940463022',
 '1.0133517787145',
 '0.986161470813006',
 '1.09820439504488',
 '1.06640283661947',
 '1.05764772395448',
 '1.02678616758973',
 '1.01876057166248',
 '1.09019498604372',
 '1.1665479238629',
 '1.07170094763279',
 '1.1326945725342',
 '1.18199297460235',
 '1.20353001964446',
 '1.00973941850665',
 '1.0662943967844',
 '1.04876624296406',
 '1.12447065457189',
 '0.954629674212134',
 '1.02961694279098']

我想要做的是计算该列表中有多少个值 >= 1.3。 返回 5,即:

      '1.57397155911713' 
      '1.40605782943842'
      '1.36037525085048'
      '1.39598077584722' 
      '1.37823533969271'

在 Python 中是否有一种简洁的方法?

【问题讨论】:

标签: python


【解决方案1】:

您在问题中提到的紧凑性是更短的代码。所以,我提出

sum(float(num) >= 1.3 for num in mylist)

这利用了这样一个事实,在 python 中,True 值被视为 1,False 被视为 0。因此,每当 float(num) >= 1.3 评估为 Truthy 时,它将是 1,如果失败,则结果将是 0。因此,我们将所有值加在一起以获得大于或等于 1.3 的项目总数。

你可以这样检查

True == 1
# True
True + True
# 2
False * 10
# 0

【讨论】:

    【解决方案2】:

    计算该列表中有多少个值 >= 1.3:

    sum(1 for x in mylist if float(x) >= 1.3)
    

    如果您需要实际提取满足条件的数字列表,只需使用列表推导式创建该列表并使用它做任何您想做的事情:

    a = [x for x in mylist if float(x) >= 1.3]
    print a
    print len(a)
    

    【讨论】:

      【解决方案3】:

      您可以使用generator expression

      一些简单的生成器可以简洁地编码为表达式,使用 语法类似于列表推导,但使用括号而不是 括号。这些表达式是为以下情况而设计的 生成器立即被封闭函数使用。 发电机 表达式更紧凑,但不如完整的生成器通用 定义并且往往比等效列表更易于记忆 理解。

      类似这样的:

      sum(1 for x in mylist if float(x) >= 1.3)
      

      【讨论】:

      • @thefourtheye 在每个答案上都留下相同的 tip 似乎不是很有建设性。还不如自己写一个答案。
      • @devnull 对不起,我会删除它们。
      【解决方案4】:

      如果您希望将值返回给您并存储在列表中,您可以这样做:

      count = []
      for value in mylist:
          num = float(value)
          if num >= 1.3:
              count.append(value)
      

      如果你想让它输出列表,只需添加:

      print(count)
      

      或者如果您想要计算更大的值的数量,请添加:

      print(len(count))
      

      【讨论】:

        【解决方案5】:

        您可以使用numpypandas,但对于这样一个简单的计算,它们会比上面提到的替代方案慢得多。

        使用numpy

        import numpy as np
        arr=np.array(mylist).astype(float)
        print len(arr[arr>=1.3])
        

        使用pandas

        import pandas as pd
        s=pd.Series(mylist).astype(float)
        print len(s[s>=1.3])
        

        或者,

        (pd.Series(l).astype(float)>=1.3).value_counts()[True]
        

        为了性能,最快的解决方案似乎是

        In [51]: %timeit sum(1 for x in mylist if float(x) >= 1.3)
        100000 loops, best of 3: 8.72 µs per loop
        

        【讨论】:

          【解决方案6】:

          这是一个替代方法,使用 reduce() 内置函数:

          reduce(lambda x, y: x + (y >= 1.3), mylist, 0)
          

          为了完整起见,因为我看到已经有一个公认的答案。关键是,通常有不止一种方法可以在 Python(或许多其他语言,就此而言)完成某事......

          【讨论】:

            【解决方案7】:

            通过使用列表推导

            >>> len([i for i in mylist if float(i) >= 1.3])

            【讨论】:

              猜你喜欢
              • 2020-10-23
              • 1970-01-01
              • 1970-01-01
              • 2016-05-09
              • 1970-01-01
              • 2020-09-28
              • 1970-01-01
              • 2022-06-22
              • 1970-01-01
              相关资源
              最近更新 更多