Python列表中最长连续正数的个数

3
我有一个浮点数列表,类似于[-2.4,-1.3,-3.8,-1.9,5.0,0.6,2.9,1.9,4.7,3.5,6.9,1.5,-4.2,3.7,2.1,6.6,7.0,-4.6,-4.9]。
我需要做的是计算值>0的最长连续序列。
尝试使用for循环实现,但只能得到总计数,使用itertools.groupby仍然只能得到值。
for i, x in groupby(mintemps):
    if float(i >= 0):
        print(len(list(x)))

任何帮助都将不胜感激。

打印出列表中大于0的数[i] - Rakesh
嗨,欢迎来到SO。你能添加一下你想要得到的输出吗? - Ayxan Haqverdili
它只打印列表中大于0的值。这个列表中可能有奇怪的<0,所以我需要计算最长的连续>0值的数量,而不是它们的总数。如果您查看上面的列表,正确答案应该是8,而这个一行代码却得到了12。 - IndirectWombat
4个回答

2
如果您使用numpyitertools,这将非常快速。
我将列表转换为布尔数组,在其中指示值是否大于0,然后将其提供给itertools.groupby以获取其最大连续值,位值为TrueFalse
import numpy as np
import itertools
narr=np.array([-2.4, -1.3, -3.8, -1.9, 5.0, 0.6, 2.9, 1.9, 4.7, 3.5, 6.9, 1.5, -4.2, 3.7, 2.1, 6.6, 7.0, -4.6, -4.9])

def max_runs_of_ones(bits):
    maxvalue=0
    for bit, group in itertools.groupby(bits):
        if bit: 
            maxvalue=max(maxvalue,sum(group))
    return maxvalue
print(narr)

print("maximum value is",max_runs_of_ones(narr>0))

输出

[-2.4 -1.3 -3.8 -1.9  5.   0.6  2.9  1.9  4.7  3.5  6.9  1.5 -4.2  3.7
  2.1  6.6  7.  -4.6 -4.9]

maximum value is 8

1
按照预期工作,使用我一开始无法理解的工具,而且非常易懂。非常感谢! - IndirectWombat
1
我有一些熊猫系列数据,想要从中提取最长的连续序列,这个方法对我非常有效,感谢您发布这篇文章... :) - Anon Omiss

1

试试这个:

a = [-2.4, -1.3, -3.8, -1.9, 5.0, 0.6, 2.9, 1.9, 4.7, 3.5, 6.9, 1.5, 3.7, 2.1, 6.6, 7.0, -4.6, -4.9]


l=[]
z=0
for i in a:
    if i > 0:
        z=z+1
    else:
        l.append(z)
        z=0

然后max(l)将是答案。

1

groupby方法需要一个key参数来指定一个函数,计算每个元素的键值。我们可以使用这个方法来创建一行代码:

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

0

你也可以这样做。去掉最大值,就可以得到所有正数序列的长度:

np.max([ len(l) for l in ("".join(["p" if i>0 else 'n' for i in a]).split('n')) if l])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接