计算列表值低于阈值

时间:2015-11-27 07:49:01

标签: python performance list count

是否有与numpy.count_nonzero(lst< t)相当的list方法? 当我在列表中使用它时(lst< t)只返回True而不是booleans列表。 我想计算低于某个阈值的列表值 什么是更好的 - 转换为numpy-array,使用sort,某种列表/生成器理解还是别的什么?

3 个答案:

答案 0 :(得分:4)

不推荐排序,因为它是O(N * logN),其中所有其他解决方案都只是O(N)。

您可以使用生成器表达式和generator-len函数,如下所示:

n = iterlen( x for x in lst if x < t )

这比列表理解要好,因为你不需要构建临时列表(你拿了len),这会占用时间和内存。

根据问题的详细信息(列表大小,元素类型),转换为numpy数组可能会更快。你应该花时间两种方法,看看哪种方法最适合你的情况。

当然,如果可能的话,最好的解决方案是将列表表示为一个刚开始的numpy数组。如果你这样做,numpy.count_nonzero(lst < t)几乎肯定是最快的。

或者,如果您可以开始构建排序列表,则可以使用bisect轻松实现count_less函数。这里的复杂性是O(logN),这对于大型列表来说是最快的。

答案 1 :(得分:2)

c将是列表(lst)中低于值t的所有项目的计数:

c = len([i for i in lst if i < t])

答案 2 :(得分:0)

You can use the cardinality package for this:

Usage:

>>> import cardinality
>>> cardinality.count(i for i in range(500) if i > 499)
1

The actual count() implementation is as follows:

def count(iterable):
    if hasattr(iterable, '__len__'):
        return len(iterable)

    d = collections.deque(enumerate(iterable, 1), maxlen=1)
    return d[0][0] if d else 0