【问题标题】:number of values in a list greater than a certain number列表中大于特定数量的值的数量
【发布时间】:2023-04-08 18:14:01
【问题描述】:

我有一个数字列表,我想获取一个数字在满足特定条件的列表中出现的次数。我可以使用列表推导(或函数中的列表推导),但我想知道是否有人有更短的方法。

# list of numbers
j=[4,5,6,7,1,3,7,5]
#list comprehension of values of j > 5
x = [i for i in j if i>5]
#value of x
len(x)

#or function version
def length_of_list(list_of_numbers, number):
     x = [i for i in list_of_numbers if j > number]
     return len(x)
length_of_list(j, 5)

还有更精简的版本吗?

【问题讨论】:

    标签: python list


    【解决方案1】:

    你可以这样做:

    >>> j = [4, 5, 6, 7, 1, 3, 7, 5]
    >>> sum(i > 5 for i in j)
    3
    

    以这种方式将True 添加到True 最初可能看起来很奇怪,但我不认为这是不符合Python 的;毕竟,自 2.3 以来的所有版本中,bool is a subclassint

    >>> issubclass(bool, int)
    True
    

    【讨论】:

    • @jamylak,为什么这比 Greg Hewgill 的好?虽然它有趣且正确,但对于阅读代码的其他人来说,它似乎不太直观且不太明显。
    • @TJD 没说更好,但我更喜欢。
    • @senderle:(Greg 的 previous 已删除答案。我添加了一个可行的新答案。:)
    • sum(1 for i in j if i > 5) 会更明确一点,如果是这样的话:) sum(1 for ... if ...) 也可以隐藏在 count 函数中。
    • @NiklasB.,啊,你当然是对的——甚至不需要条件表达式。
    【解决方案2】:

    您可以像这样创建一个较小的中间结果:

    >>> j = [4, 5, 6, 7, 1, 3, 7, 5]
    >>> len([1 for i in j if i > 5])
    3
    

    【讨论】:

    • sum(1 for i in j if i > 5) 这样您就不必将列表加载到内存中。
    【解决方案3】:

    如果您以其他方式使用 numpy,则可以节省几笔,但我认为它不会比 senderle 的答案更快/更紧凑。

    import numpy as np
    j = np.array(j)
    sum(j > i)
    

    【讨论】:

      【解决方案4】:

      一种(有点)不同的方式:

      reduce(lambda acc, x: acc + (1 if x > 5 else 0), j, 0)

      【讨论】:

        【解决方案5】:

        如果您正在使用 NumPy(如 ludaavic 的回答),对于大型数组,您可能希望使用 NumPy 的 sum 函数而不是 Python 的内置函数 sum 以显着加速 - 例如,>1000x 加速我的笔记本电脑上有 1000 万个元素数组:

        >>> import numpy as np
        >>> ten_million = 10 * 1000 * 1000
        >>> x, y = (np.random.randn(ten_million) for _ in range(2))
        >>> %timeit sum(x > y)  # time Python builtin sum function
        1 loops, best of 3: 24.3 s per loop
        >>> %timeit (x > y).sum()  # wow, that was really slow! time NumPy sum method
        10 loops, best of 3: 18.7 ms per loop
        >>> %timeit np.sum(x > y)  # time NumPy sum function
        10 loops, best of 3: 18.8 ms per loop
        

        (以上使用IPython的%timeit“magic”进行计时)

        【讨论】:

          【解决方案6】:

          使用 bisect 模块的不同计数方式:

          >>> from bisect import bisect
          >>> j = [4, 5, 6, 7, 1, 3, 7, 5]
          >>> j.sort()
          >>> b = 5
          >>> index = bisect(j,b) #Find that index value
          >>> print len(j)-index
          3
          

          【讨论】:

            【解决方案7】:

            我将添加地图和过滤器版本,因为为什么不这样做。

            sum(map(lambda x:x>5, j))
            sum(1 for _ in filter(lambda x:x>5, j))
            

            【讨论】:

              【解决方案8】:

              你可以这样使用函数:

              l = [34,56,78,2,3,5,6,8,45,6]  
              print ("The list : " + str(l))   
              def count_greater30(l):  
                  count = 0  
                  for i in l:  
                      if i > 30:  
                          count = count + 1.  
                  return count
              print("Count greater than 30 is : " + str(count)).  
              count_greater30(l)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-02-07
                • 2019-12-18
                • 1970-01-01
                • 2018-06-23
                • 2013-09-19
                • 1970-01-01
                相关资源
                最近更新 更多