Не могу додуматься как написать функцию которая преобразует входной список след. образом
Есть список [1, 1, 2, 3, 3, 2, 2, 4]
На выходе надо получить [[1, 1], [2], [3,3], [2, 2], [4]
То есть добавлять надо список состоящий из вот таких одинаковых, последовательно идущих чисел.
Сижу уже долго, пытался рекурсией запилить, не вышло че т. Буду благодарен за наводку или псевдокод
P.S. Не судите строго:) Возможно тут полный бред написан, но у меня голова уже не работает и с рекурсией я не особо писал. Здесь я вместо выхода из рекурсии подумал обернуть все в try/except, но что то не так пошло. Данная шляпа возвращает None
result = []
def split(array: list):
try:
partition = []
current_elem = array.pop(0)
partition.append(current_elem)
for elem in array:
if elem == current_elem:
partition.append(elem)
else:
result.append(partition)
start_idx = array.index(elem)
split(array[:start_idx])
except IndexError as e:
return result
Ответы (3 шт):
Можно вот так преобразовать список в список списков повторений
res = []
def uniq(array):
part = [array[0]]
current = array.pop(0)
if len(array) == 0:
res.append(part)
iter = 0
for elem in array:
if elem == current:
part.append(elem)
iter += 1
if len(array) == iter:
res.append(part)
else:
res.append(part)
uniq(array[iter:])
break
uniq(lst)
print(res)
Если необязательно рекурсией, то можно через itertools.groupby
from itertools import groupby
lst = [1, 1, 2, 3, 3, 2, 2, 4]
out = [list(g) for _, g in groupby(lst)]
print(out)
[[1, 1], [2], [3, 3], [2, 2], [4]]
Через простой цикл:
items = [1, 1, 2, 3, 3, 2, 2, 4]
new_items = [[items[0]]]
for i in range(1, len(items)):
x = items[i]
sub = new_items[-1]
if x in sub:
sub.append(x)
else:
new_items.append([x])
print(new_items)
# [[1, 1], [2], [3, 3], [2, 2], [4]]