将字符串拆分成重复图案的不均匀大小的块

时间:2016-09-02 03:09:46

标签: python python-2.7 split

我有一个表示一系列位的字符串:

bit_stream = "10100101011101011101011"  # ...(so on)

我需要将它分成不规则大小的块,重复模式。第一个块应该是长度1,然后是长度为8的块,然后是长度为2的块,依此类推,直到这些位耗尽:

result = ["1", "01001010", "11", "1", "01011101", "01", "1"]  # ...(so on)

3 个答案:

答案 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还是其他任何长度),并且即使长度为比特流没有精确地加起来长度之和的倍数。 (你可以在我的例子中看到它用完了比特,最后一个块只有五个。)在你的情况下这可能是也可能不合适,所以你可能想要检查一下你准备好后你有足够的数据来转换那样做。

参考:itertools.cycle

答案 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']