Кодировка длин серий (Википедия) :
import random
import sys
random.seed(42)
def getValue(lastValue):
if random.randint(1,100)==100: # 1% change chance
return not lastValue
return lastValue
data = []
lastValue = False
for _ in range(18000):
lastValue=getValue(lastValue)
data.append(lastValue)
print(data)
def runLengthEncoded(data):
rl = []
last = data[0]
occ = 1
for d in data[1:]:
if d == last:
occ += 1
else:
rl.append( (last,occ))
occ = 1
last = d
rl.append( (last,occ) )
return rl
rl = runLengthEncoded(data)
print(rl)
Вывод здесь:
[(False, 110), (True, 90), (False, 297), (True, 173), (False, 37), (True, 108), (False, 28),
(True, 54), (False, 154), (True, 234), (False, 137), (True, 7), (False, 164), (True, 32),
(False, 167), (True, 107), (False, 9), (True, 100), (False, 114), (True, 73), (False, 73),
# snipp #
(False, 156), (True, 23), (False, 373), (True, 86), (False, 122), (True, 82), (False, 250),
(True, 75), (False, 207), (True, 102), (False, 42), (True, 14), (False, 359), (True, 324),
(False, 48), (True, 123), (False, 135), (True, 120), (False, 136), (True, 145), (False, 82)]
Истина / Ложь являются избыточными, если вы сохраняете исходный кодзначение вы можете сократить это еще больше.Если вы хотите использовать временные метки, просто сохраните метки там, где значение изменяется.
def runLengthEncoded2(data):
rl = []
last = data[0]
occ = 1
for d in data[1:]:
if d == last:
occ += 1
else:
rl.append(occ)
occ = 1
last = d
rl.append( occ )
return (data[0],rl)
для:
(False, [110, 90, 297, 173, 37, 108, 28, 54, 154, 234, 137, 7, 164, 32, 167, 107, 9, 100, 114,
73, 73, 10, 21, 71, 35, 74, 238, 13, 20, 382, 112, 213, 67, 331, 13, 25, 74, 100, 48,
119, 74, 20, 72, 57, 86, 70, 283, 47, 26, 46, 12, 154, 14, 7, 129, 27, 69, 179, 129,
14, 33, 86, 9, 171, 36, 203, 81, 50, 28, 54, 58, 39, 108, 7, 34, 196, 139, 9, 205,
15, 45, 21, 209, 22, 40, 39, 19, 305, 15, 351, 24, 212, 3, 37, 26, 7, 150, 106, 176,
390, 61, 40, 194, 261, 89, 337, 457, 31, 53, 24, 487, 94, 334, 158, 446, 16, 300, 93,
5, 189, 62, 200, 136, 84, 75, 1, 179, 52, 19, 123, 54, 42, 130, 97, 77, 101, 11, 166,
85, 126, 156, 23, 373, 86, 122, 82, 250, 75, 207, 102, 42, 14, 359, 324, 48, 123, 135,
120, 136, 145, 82])