Подсчет интервалов в списке

346 просмотра
0
0 Комментариев

Есть список, в котором записано

0.0211742352314066
-0.0628333091715691
-0.0906908652845038
0.0216636396360264
0.0216636396360264
-0.0133892371190161
0.0175451792157489
0.000499875041650993
0.0176434351725953
0.0239118200463129

Нужно посчитать максимальное количество позитивных между негативными значениями. В данном случае программа должна вернуть 4.

Как я понимаю, нужно в цикле перебрать список и встречая позитивные значения записывать их в счетчик в итоге перезаписывая счетчик если искомые значения превышают число счетчика. Но вот никак не могу реализовать.

        for i in e:
        if i > 0:
            arr = {}
            arr[i] += 1
        else:
            arr[i] = 1
            print(arr)


Добавить комментарий

3 Answers

Python Опубликовано 16.12.2018
0

Ну да, счётчик, всё правильно понимаете. Только зачем вместо счётчика использовать словарь, который к тому же затирается каждый раз?

maxsize = 0
size = 0
for i in e:
    if i > 0:
        size += 1
        if size > maxsize:
            maxsize = size
    else:
        size = 0
print(maxsize)

Добавить комментарий
0

Решение очень прямолинейное (прямо следует текстовому описанию):

max_count = count = 0 # number of positive numbers between negative
for n in numbers:
    if n > 0: # positive: increment count
        count += 1
        max_count = max(max_count, count)
    elif n < 0: # negative: reset count
        count = 0
    else: # zero: do nothing
        assert n == 0
print(max_count)

Единственная тонкость: если число равно нулю, то оно не является ни положительным, ни отрицательным.

Добавить комментарий
0

Хочу показать, в связи с этим вопросом, одну очень полезную функцию, которую я почерпнул отсюда.

from itertools import groupby
 
def isplit(iterable, splitters):
    if isinstance(splitters, tuple) or isinstance(splitters, set) or isinstance(splitters, list):
        cond = lambda x: x in splitters
    else:
        cond = lambda x: x == splitters
    return [list(g) for k, g in groupby(iterable, cond) if not k]
 
# А теперь — применение.
len(max(isplit(map(lambda x: x > 0, x), False)))

UPD:

Ещё можно сделать такой финт ушами:

max([sum(1 for i in g) for k, g in groupby(x, lambda x: x < 0) if not k])

В принципе, это то же самое, просто упакованное в одну специфичную для данной задачи конструкцию.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up