2017-01-30 4 views
2

Ich arbeite an Cryptopals Challenge #6String-Gruppierung in Python

Wenn die Zeichenfolge ‚11111222223333344444‘ und ich möchte Gruppen von 5, wie ich Gruppe zu tun und die Paare vergleichen.

Zum Beispiel möchte ich "11111" und "22222", "33333" und "44444" gruppieren und vergleichen. Wie könnte das gemacht werden?

benutzte ich diesen Code und halten zusätzliche Zeilen nach dem die 4 bekommen ...

>>> for i in range(0, int(len(string)/size)): 
...  print(string[previous : previous + size]) 
...  print(string[previous + size : previous + size * 2]) 
...  previous += size * 2 

11111 
22222 
33333 
44444 

Was andere Wege gibt, dies zu tun?

+0

vergleichen? Was meinen Sie? Sie sind anders. Du meinst du kannst 10 mal '1' haben? –

+0

Vergleicht man im Allgemeinen, aber speziell mit diesem Projekt, muss ich die durchschnittliche Hamming-Distanz der Saite nehmen. Also muss ich die Hamming-Distanz der ersten und zweiten Saite, der dritten und der vier Saiten usw. nehmen und dann den Durchschnitt berechnen. –

Antwort

3

Sie können zip idiom verwenden, um Elemente in Gruppen bekannter Größe zu gruppieren.

s='11111222223333344444' 
for i in zip(*[iter(s)]*5): 
    print(i) 

Ausgänge:

('1', '1', '1', '1', '1') 
('2', '2', '2', '2', '2') 
('3', '3', '3', '3', '3') 
('4', '4', '4', '4', '4') 

Wenn Sie sie als einzelne Zeichenfolge wollen Sie ''.join

for i in zip(*[iter(s)]*5): 
    print(''.join(i)) 

Ausgänge verwenden:

11111 
22222 
33333 
44444 
+0

Wie würde ich dies mit einer dekodierten Basis 64 String tun. Zum Beispiel, 'base64.b64decode (string)' @PatrickHaugh –

1

Es gibt ein paar Möglichkeiten, um dies zu tun. Eine klassische Anwendung ist über Liste Verständnis:

chunks = [string[i:i + 5] for i in range(0, len(string), 5)] 

Mit itertools.zip_longest ist meine Präferenz:

def chunk(seq, size): 
    for ch in itertools.zip_longest(*([iter(seq)] * size)): 
     if None in ch: 
      ch = ch[:ch.index(None)] 
     yield ''.join(ch) 
1
def grouper(i, group_size): 
    start = 0 
    end = group_size 
    while start < len(i): 
     yield i[start:end] 
     start = end 
     end += group_size 

groups = [i for i in grouper('11111222223333344444', 5)] 

print(groups) 
['11111', '22222', '33333', '44444'] 
+0

Es gibt eine Menge von externen Kopien hier, während len (i [Start:]): yield seq [start: start + group_size]; start + = group_size' entfernt die Notwendigkeit, eine separate 'end'-Variable zu verfolgen. – TemporalWolf