我有一个表示一系列位的字符串:
bit_stream = "10100101011101011101011" # ...(so on)
我需要将它分成不规则大小的块,重复模式。第一个块应该是长度1,然后是长度为8的块,然后是长度为2的块,依此类推,直到这些位耗尽:
result = ["1", "01001010", "11", "1", "01011101", "01", "1"] # ...(so on)
答案 0 :(得分:2)
一种方法是使用类来跟踪状态,使用迭代器来返回位组。 itertools.cycle
用于重复生成位计数:
from itertools import cycle
class Bits(object):
def __init__(self,input_bits,bit_counts):
self.bits = input_bits
self.counts = cycle(bit_counts)
def __iter__(self):
while self.bits:
count = next(self.counts)
bits,self.bits = self.bits[:count],self.bits[count:]
yield bits
print(list(Bits('10100101011101011101011',(1,8,2))))
输出:
['1', '01001010', '11', '1', '01011101', '01', '1']
答案 1 :(得分:2)
我这样做与大约一分钟前发布的其他答案类似,但我没有使用课程来跟踪状态。
import itertools
def alternating_size_chunks(iterable, steps):
n = 0
step = itertools.cycle(steps)
while n < len(iterable):
next_step = next(step)
yield iterable[n:n + next_step]
n += next_step
测试:
>>> test_string = ''.join(random.choice('01') for _ in range(50))
>>> print(list(alternating_size_chunks(test_string, (1, 8, 2))))
['1', '01111010', '01', '1', '00111011', '11', '0', '11010100', '01', '0', '10011101', '00', '0', '11111']
请注意,这两种方法(我的和Mark的回答)将采用任意长度(无论是1,8,8还是其他任何长度),并且即使长度为比特流没有精确地加起来长度之和的倍数。 (你可以在我的例子中看到它用完了比特,最后一个块只有五个。)在你的情况下这可能是也可能不合适,所以你可能想要检查一下你准备好后你有足够的数据来转换那样做。
答案 2 :(得分:0)
bit_stream = "10100101011101011101011"
fmt = [1,8,2]
i = 0
j = 0
lenb = len( bit_stream )
result = []
while True:
l = j + fmt[i]
if l < lenb:
result.append( bit_stream[j:l] )
else:
result.append( bit_stream[j:lenb] )
break
j = l
i = i + 1
if i > 2:
i = 0
print result
输出:
['1', '01001010', '11', '1', '01011101', '01', '1']