«Разделение» вывода RLE (GroupBy) в зависимости от определенного значения («символ» для разделения RLE)
Вопрос
Рассмотрим «строку» (рассматривать ее как массив цифр)
0 0 1 8 8 8 1 0
RLE ("GroupBy") есть:
[(0,2), (1, 1), (8,3), (1, 1), (0, 1)]
Затем мы обогащаем вышеупомянутый RLE суммой длины прогона предыдущих элементов.
Следовательно, обогащенная версия вышеизложенного становится:
[(0, (0,2)), (0+2, (1, 1)), (0+2+1, (8,3)), (0+1+2+3, (1, 1)), (0+1+2+3+1, (0, 1))]
«Строка» разделен на 1:
0 0 , 8 8 8 , 0
RLE Split на 1
[(0,2)] , [(8,3)] , [(0, 1)]
«Строка» разделен на 8:
0 0 1 , , , 1 0
RLE Split на 8
[(0,2), (1, 1)] , , , [(1, 1), (0, 1)]
Примечание. В своих примерах я процитировал списки «RLE Dloth on z», не обогащая их. Это не будет так. Я оставил их, чтобы уменьшить беспорядок. Например, «разделение RLE на 1» действительно должно рассматриваться как:
[(0, (0,2))] , [(0+2+1, (8,3))] , [(0+1+2+3+1, (0, 1)]
Как я могу достичь этого "раскола RLE" на Z (= 1, 8; в этом случае)
Хорошо оставлять пустые массивы (после разделения).
Возможно, умный список? (Кажется, немного легче решить с помощью петли с добавлением вложенного внутри)
Решение
Просто для того, чтобы показать, как, я настоятельно рекомендую вам не использовать это
"Элегантный" уродливый способ:
>>> data
[0, 0, 1, 8, 8, 8, 4, 4, 1, 0]
>>> def fromDataToSplitRLE(dat,n):
RLE=[(k,len(tuple(g))) for k,g in itertools.groupby(dat)]
tmp=tuple(zip(*RLE))
return [list(g) for k,g in itertools.groupby((zip((sum(tmp[1][:i]) for i in range(len(tmp[1]))) ,(zip(*tmp)))),lambda x:x[1][0]!=n) if k]
>>> fromDataToSplitRLE(data,1)
[[(0, (0, 2))], [(3, (8, 3)), (6, (4, 2))], [(9, (0, 1))]]
Другие советы
import itertools
def get_rle(list_of_digits, split_on=None):
count = 0
rle = []
active_group = []
rle_app = rle.append
for item, group in itertools.groupby(list_of_digits):
L = len(list(group))
if item == split_on:
rle_app(active_group)
active_group = []
else:
active_group.append((count, (item, L)))
count += L
rle_app(active_group)
return rle
list_of_digits = map(int, '0 0 1 8 8 8 1 0'.split())
print get_rle(list_of_digits)
print get_rle(list_of_digits, 8)
print get_rle(list_of_digits, 1)
aaron@aaron-laptop:~/code/tmp$ python rle.py
[[(0, (0, 2)), (2, (1, 1)), (3, (8, 3)), (6, (1, 1)), (7, (0, 1))]]
[[(0, (0, 2)), (2, (1, 1))], [(6, (1, 1)), (7, (0, 1))]]
[[(0, (0, 2))], [(3, (8, 3))], [(7, (0, 1))]]