Как получить подряд идущие цифры в списке

Есть список с цифрами. Если есть 2 и более подряд идущие цифры, то нужно из них оставить одну, при этом увеличив ее на число убранных. Т.е. есть [1, 2, 2, 5, 8, 8, 8]. Из него должно получится [1, 3, 5, 10]. Возможно ли реализовать такое?


Ответы (3 шт):

Автор решения: entithat

Можно сделать так: проходимся по каждому элементу массива, при этом считая кол-во повторений. Если следующий элемент не равен текущему, то добавляем его в новый массив с определенным условием.

a = [1, 2, 2, 5, 8, 8, 8]

b = []
c = 0

for i in range(len(a)):
    if i < len(a) - 1 and a[i] == a[i + 1]:
        c += 1
    else:
        if c > 0:
            b.append(a[i - 1] + c)
            c = 0
        else: 
            b.append(a[i])
→ Ссылка
Автор решения: GrAnd

Можно используя соответствующую функцию.

from itertools import groupby

a = [1, 2, 2, 5, 8, 8, 8, 7, 7, 1, 1, 1]

result = [k + len(list(g))-1 for k,g in groupby(a)]
print('>>>', result)
>>> [1, 3, 5, 10, 8, 3]

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

if len(result) > 1 and a[0] == a[-1]:
    result[0] += result.pop() - a[0] + 1 
>>> [4, 3, 5, 10, 8]

Вариант через генератор.

a = [1, 2, 2, 5, 8, 8, 8]

def get_compressed(lst):
    if lst: 
        si = 0
        for i, el in enumerate(lst):
            if el != lst[si]:
                yield lst[si] + i-si-1
                si = i
        yield lst[si] + i-si

result = list(get_compressed(a))
print('>>>', result)
>>> [1, 3, 5, 10]
→ Ссылка
Автор решения: TigerTV.ru

Через цикл, без импорта:

def eat(data):
    data_it = iter(data)
    last = next(data_it)
    count = 0
    res = []
    for d in data_it:
        if last == d:
            count += 1
        else:
            res.append(last + count)
            count = 0
            last = d
    res.append(last + count)
    return res


a = [1, 2, 2, 5, 8, 8, 8]
print(eat(a))
# [1, 3, 5, 10]
→ Ссылка