2016-09-02 12 views
-2

我有代表一系列的比特串:分割字符串轉換成不均勻大小的塊中的重複圖案

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

我需要以重複圖案此分裂成不均勻大小的塊。第一個塊應該是長度爲1,接着長度爲8的塊,然後一個長度爲2的塊,等等,直到位被耗盡:

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

這是什麼(1,8,2)格式?如果可能,請給出簡要說明或鏈接......並且您還需要展示您嘗試過的內容。 – Julien

+0

我的意思是(1,8,2)格式是這樣的: '[1,01001010,11,1,010101,01,1 ...(如此)]' ^ ^^^^^^^ ^^ ^^ 1 --- 8 ------- 2- –

+0

你是暗示1 = 1,8 = 01001010,還是2 = 11?如果是這樣,那麼你能解釋一下你如何提出這個映射嗎? –

回答

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

注意,這兩種方法(我和馬克的回答)將長度任意一組(無論是1,8,2或其他任何東西),而將工作即使比特流的長度不精確地加起來爲長度總和的倍數。 (您可以在我的示例中看到它已用完,最後一個塊只有五個)。對於您的情況,這可能是也可能不是,因此您可能需要檢查是否有足夠的數據進行轉換,一旦準備就緒去做。

參考:itertools.cycle

+0

謝謝,但是當我使用您的代碼時,我得到了這個錯誤先生。它說'NameError:全局名稱'itertools'沒有被定義' –

+0

你必須'import itertools' - 編輯答案來顯示一個例子 –

+0

這與所需的輸出不匹配,它具有長度[1,8,2, 1,10,1,2]。顯然你不應該假定[1,8,2]重複。 「重複」必定意味着別的東西。 –

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'] 
+0

@ Two-BitAlchemist我更喜歡你的...更少的字符串切片和更簡單。 –

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'] 
+0

您在那裏使用的偉大邏輯,謝謝! –

+1

只要你知道'len'是Python中的一個O(1)操作(對象將它們的長度存儲在內部屬性中,至少是內置屬性),所以它可能會更清晰地調用'len'而不是存儲它在當地。 –

+0

謝謝@ Two-BitAlchemist的信息。 – stuartnox