2016-09-02 3 views
-2

Ich habe eine Zeichenfolge, die eine Reihe von Bits, die:Split eine Zeichenfolge in ungleichmäßig Chunks in ein sich wiederholendes Muster

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

Ich brauche in ein sich wiederholendes Muster dies in ungleichmäßig große Stücke aufgeteilt. Der erste Block sollte von einem Stück von Länge 8, dann ein Stück der Länge 2, und so weiter, bis die Bits erschöpft Länge 1, folgen:

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

Was ist (1,8,2) Format? Bitte geben Sie eine kurze Beschreibung wenn möglich oder einen Link ... Auch Sie werden voraussichtlich zeigen, was Sie versucht haben. – Julien

+0

Ich meine, die (1,8,2) Format so etwas wie diese: '[1, 01001010, 11, 1, 010101, 01, 1 .. (usw.)]' ^ ^^^^^^^ ^^ ^^ 1 --- 8 ------- 2- –

+0

Behaupten Sie, dass 1 = 1, 8 = 01.001.010 und 2 = 11? Wenn ja, können Sie dann erklären, wie Sie mit diesem Mapping umgehen? –

Antwort

2

ich das vor etwa einer Minute gebucht ähnlich wie die andere Antwort hat, aber ich eine Klasse nicht Zustand nachverfolgt verwenden .

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 

Testing:

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

Beachten Sie, dass diese beiden Methoden (meine und die Antwort von Mark) wird eine beliebige Menge von Längen nehmen (ob es sich um 1, 8, 2 oder irgendetwas anderes), und arbeiten auch wenn sich die Länge des Bitstroms nicht genau zu einem Vielfachen der Summe der Längen addiert. (Sie können sehen, in meinem Beispiel lief es aus Bits und der letzte Teil hat nur fünf.) Dies kann oder nicht in Ihrem Fall wünschenswert sein, so möchten Sie vielleicht überprüfen, ob Sie genug Daten haben, um zu konvertieren, sobald Sie fertig sind TU das.

Referenz: itertools.cycle

+0

Danke, aber ich habe diesen Fehler, wenn ich Ihren Code Sir benutze. Es heißt 'NameError: globaler Name' itertools 'ist nicht definiert' –

+0

Sie müssen 'itertools' importieren - bearbeitete Antwort, um ein Beispiel zu zeigen –

+0

Dies stimmt nicht mit der gewünschten Ausgabe überein, die Längen [1, 8, 2, 1, 10, 1, 2]. Anscheinend sollte man nicht davon ausgehen, dass sich [1, 8, 2] wiederholt. Das "Wiederholen" muss etwas anderes bedeuten. –

2

Eine Möglichkeit ist die Verwendung einer Klasse-Zustand zu verfolgen und ein Iterator, um Gruppen von Bits zurückzugeben. itertools.cycle wird verwendet, wiederholt die Bitzählwerte zu generieren:

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)))) 

Ausgang:

['1', '01001010', '11', '1', '01011101', '01', '1'] 
+0

@ Two-BitAlchemist Ich mag deine besser ... weniger String Slicing und einfacher. –

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 

Ausgang:

['1', '01001010', '11', '1', '01011101', '01', '1'] 
+0

Großartige Logik, die du dort benutzt hast, danke! –

+1

Nur damit Sie wissen, dass 'len' eine O (1) -Operation in Python ist (Objekte speichern ihre Länge auf einer internen Eigenschaft, zumindest eingebauten), so dass es einfacher ist,' len' überall aufzurufen, anstatt es zu speichern in einem lokalen. –

+0

Danke @ Two-BitAlchemist für die Info. – stuartnox

Verwandte Themen