У меня есть серия:
series = [0,2, 1, -2, 0, 0, 2, 3 ,1, 7]
Какой самый эффективный способ найти длину самой длинной строки последовательных положительных чисел?В этом примере оно должно быть 4 (длина [2, 3, 1, 7])
Раствор от pandas
pandas
s=pd.Series(np.sign(np.array(series))) pd.crosstab(s,s.diff().ne(0).cumsum()) Out[495]: col_0 1 2 3 4 5 row_0 -1 0 0 1 0 0 0 1 0 0 2 0 1 0 2 0 0 4 pd.crosstab(s,s.diff().ne(0).cumsum()).max(1) Out[494]: row_0 -1 1 0 2 1 4 dtype: int64
С точки зрения самое эффективное время будет трудно обойти простой цикл:
def maxPositiveRun(): count = 0 maxVal = 0 for n in series: if n > 0: count +=1 if count > maxVal: maxVal = count else: count = 0 return maxVal
Это предполагает самое эффективное время вы имеете в виду времядля выполнения функции, а не для того, чтобы понять или написать функцию.
Вы можете использовать itertools.groupby для группировки положительных чисел, а затем max, чтобы найти самый длинный ряд таких чисел
itertools.groupby
max
>>> from itertools import groupby >>> max((list(g) for k, g in groupby(series, key=lambda i: i > 0)), key=len) [2, 3, 1, 7]