你可以使用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个或更多个值的> =阈值将出现在一组与键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)
什么,如果'list_of_values'有'1.0'作为第一个项目?结果应该是什么? – RomanPerekhrest
然后计数器增加1,因为1.0是> = treshold_value。所有值
ConSod
如果有多于一个数字满足条件,例如'[2.0,2.0,2.0,2.0,0.0,3.0,2.0,2.0,2.0,10.0,0,0]'?如果结果是4,5或9? – mhawke