如果超过某个值,则计算元素

时间:2017-09-27 13:15:13

标签: python list count

我有一个元素列表,其中包含某些float类型的值。我想迭代元素并在它们超过某个值时对它们进行计数,但是如果它们在阈值值上显示minimum_count次,则只计算它们。例如,如果a有以下输入:

list_of_values = [2.0, 2.0, 2.0, 2.0, 0, 0, 2.0, 2.0, 2.0, 0, 0]
treshold_value = 1.0
minimum_count = 4

答案应为4,因为treshold_value 1.0仅在索引0-3处连续超过4次。我现在有以下代码,

for value in list_of_values:
    if value >= treshold_value:
        counter += 1
    if counter >= (minimum_count):
        time_use += 1
    if value < min_treshold_value:
        counter = 0
print(time_use)

我知道应该有一些pythonic方法来实现这个目标:)

编辑:应计算超过阈值的所有连续子序列值的总和。

4 个答案:

答案 0 :(得分:2)

以下使用带有条件生成器的groupby和带有适当键功能的max应该有效:

from itertools import groupby

len(max((list(g) for k, g in groupby(list_ov, key=lambda x: x > threshold) if k), key=len))

groupby通过连续相同的值对关键函数进行迭代。它生成密钥值对和sub-iterable。

答案 1 :(得分:1)

您可以使用itertools.groupby()来提供帮助:

from itertools import groupby

def count_runs(list_of_values, threshold_value=1.0, minimum_count=4):
    count = 0
    for k, g in groupby(list_of_values, key=lambda x: x >= threshold_value):
        if k:
            g = list(g)
            if len(g) >= minimum_count:
                count += len(g)
    return count

>>> count_runs([2.0, 2.0, 2.0, 0.0, 0, 0, 2.0, 2.0, 2.0, 0, 0])
0
>>> count_runs([2.0, 2.0, 2.0, 2.0, 0, 0, 2.0, 2.0, 2.0, 0, 0])
4
>>> count_runs([2.0, 2.0, 2.0, 2.0, 0, 0, 3.0, 2.0, 2.0, 2.0, 10.0, 0, 0])
9

这将提供minimum_count或更多组中超过阈值的值的计数。请注意,它会处理符合条件的多个组。

例如,最后一个示例的groupby()将返回以下内容:

>>> list_of_values = [2.0, 2.0, 2.0, 2.0, 0, 0, 3.0, 2.0, 2.0, 2.0, 10.0, 0, 0]
>>> for k, g in groupby(list_of_values, key=lambda x: x >= threshold_value):
...     print(k, list(g))
... 
True [2.0, 2.0, 2.0, 2.0]
False [0, 0]
True [3.0, 2.0, 2.0, 2.0, 10.0]
False [0, 0]

任何一组包含1个或多个值&gt; =阈值的组将显示在具有键True的组中。只有那些长度> =最小计数的人才会被进一步考虑,其长度将与其他此类人群进行统计。

这段代码可以写得更简洁,更不易读,如下:

def count_runs(list_of_values, threshold_value=1.0, minimum_count=4):
    return sum(count for count in (len(list(g)) for k, g in groupby(list_of_values, key=lambda x: x >= threshold_value) if k) if count >= minimum_count)

答案 2 :(得分:0)

只需遍历列表并使用key =浮点数和值=您遇到此数字的次数创建一个字典。并且只添加大于阈值的dict浮点数。像这样的东西:

d = {}
for f in   list_of_values :
    if f > treshold:
        if d.get(f,False):
             d[f] +=1
        else:
             d[f] = 1
max = 0
for k,v in d.iteritems():
    if v> max:
        max = v

return max

答案 3 :(得分:0)

看起来你并不关心订单。在这种情况下,groupby不正确,因为它只对相邻元素进行分组。

您可以使用计数器和两个列表推导来过滤值:

list_of_values = [2.0, 2.0, 2.0, 2.0, 0, 0, 3.0, 2.0, 2.0, 2.0, 10.0, 0, 0]
threshold_value = 1.0
minimum_count = 4

from collections import Counter
counter = Counter([x for x in list_of_values if x > threshold_value])
print(counter)
# Counter({2.0: 7, 3.0: 1, 10.0: 1})
print([(x, count) for x, count in counter.items() if count > minimum_count])
# [(2.0, 7)]