Подсчитать самую длинную полосу> 0 в списке Python Python - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть список значений с плавающей точкой, что-то вроде [-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)))

Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

0 голосов
/ 05 ноября 2018

Метод groupby принимает аргумент key, чтобы указать функцию для вычисления значения ключа для каждого элемента. Мы можем использовать это, чтобы создать однострочник:

max(len(list(g)) for k, g in groupby(mintemps, key=lambda x: x > 0) if k)
0 голосов
/ 05 ноября 2018

Вы также можете сделать следующее. Удаление максимума даст вам всю последовательность последовательностей положительных чисел:

np.max([ len(l) for l in ("".join(["p" if i>0 else 'n' for i in a]).split('n')) if l])
0 голосов
/ 05 ноября 2018

Если вы используете numpy и itertools, это получается довольно быстро,

Я преобразовал список в логический массив, в котором значения указаны, если элемент больше 0, и затем передал его в itertools.groupby, чтобы получить его максимальное последовательное значение, значение бита равно True или False .

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))

OUTPUT

[-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
0 голосов
/ 05 ноября 2018

Попробуйте это:

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...