Эта ситуация больше похожа на проблему кодирования длины прогона . Рассмотрим more_itertools.run_length
:
С учетом
import more_itertools as mit
iterable = [1, 2, 3, 5, 5, 5, 5, 0, -2, -3, -6, -8, 9, 9, 9]
Код
result = [[0] if n == 1 else [1] * n for _, n in mit.run_length.encode(iterable)]
result
# [[0], [0], [0], [1, 1, 1, 1], [0], [0], [0], [0], [0], [1, 1, 1]]
Теперь просто сведите подсписки (как хотите) в один список:
list(mit.flatten(result))
# [0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1]
подробности
mit.run_length.encode
сжимает итерируемое, получая кортежи ( значение , # повторений ), например ::1010 *
list(mit.run_length.encode("abaabbba"))
# [('a', 1), ('b', 1), ('a', 2), ('b', 3), ('a', 1)]
Наше понимание игнорирует значение, использует повторы n
и создает подсписки [0]
и [1] * n
.
Примечание: more_itertools
- сторонний пакет. Установить через > pip install more_itertools
.