Как получить подряд идущие цифры в списке
Есть список с цифрами. Если есть 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]