Поскольку у вас есть отображение символов в 3-битную строку, bitarray отлично справляется с кодированием и декодированием списков символов в и из массивов битов:
from bitarray import bitarray
from random import choice
symbols = {
'0' : bitarray('000'),
'a' : bitarray('001'),
'b' : bitarray('010'),
'c' : bitarray('011'),
'd' : bitarray('100'),
'e' : bitarray('101'),
'f' : bitarray('110'),
'g' : bitarray('111'),
}
seedstring = ''.join(choice(symbols.keys()) for _ in range(40))
# construct bitarray using symbol->bitarray mapping
ba = bitarray()
ba.encode(symbols, seedstring)
print seedstring
print ba
# what does bitarray look like internally?
ba_string = ba.tostring()
print repr(ba_string)
print len(ba_string)
Печать:
egb0dbebccde0gfdfbc0d0ccfcg0acgg0ccfga00
bitarray('10111101000010001010101001101110010100... etc.
'\xbd\x08\xaanQ\xf4\xc9\x88\x1b\xcf\x82\xff\r\xee@'
15
Вы можете видеть, что этот список из 40 символов (120 битов) кодируется в 15-байтовый битовый массив.