2015-11-03 7 views
8

Ich habe diese SaiteErsatzteil ein Wörterbuch in Python mit

message = '10100010011' 

und dieses Wörterbuch

codes = {97: '1', 98: '01', 107: '001', 114: '000'} 

und ich brauche die ursprüngliche Nachricht mit dem Wörterbuch zu so etwas wie diese

[97, 98, 114, 97, 107, 97] 
ersetzen

Ich habe meinen eigenen Weg versucht, was funktioniert, aber wenn ich einige wirklich große Saiten verwende, ist es nur sehr langsam. Gibt es dafür einen schnelleren Weg?

codes = dict(zip(codes.values(), codes.keys())) 
    decoded_mess = [] 
    pom = "" 
    for i in message: 
     pom += i 
     if pom in codes: 
      decoded_mess.append(codes[pom]) 
      pom = "" 

sah ich die Antworten hier Easiest way to replace a string using a dictionary of replacements? und ich versuchte, aber das nicht für mich arbeiten. Vielleicht, weil es sich um ganze Wörter handelt, aber ich habe 1 lange Folge von 1s und 0s.

+3

Ist das nicht Ihr Wörterbuch falsch herum? Und sollten nicht alle Schlüssel (oder Werte) eine feste Länge haben? – jonrsharpe

+0

@jonrsharpe er tauscht Schlüsselwerte in der Lösung aus. – Maroun

+0

@MarounMaroun oh ... dann warum das separat zeigen ?! – jonrsharpe

Antwort

-1

Zunächst sollte das codes Wörterbuch rückwärts sein, um das Nachschlagen zu erleichtern. Meine Strategie besteht darin, die Nachricht jeweils einzeln zu scannen. Wenn ein Ersatz gefunden wurde, gib ihn zurück. Wenn nicht, füge das nächste Zeichen hinzu und suche erneut nach. Machen Sie dies solange, bis ein Ersatz gefunden oder die Nachricht erschöpft ist.

def seach_replace(buffer, codes): 
    codes = {v: k for k, v in codes.items()} # Reverse the key, value 
    text_so_far = '' 
    for c in buffer: 
     text_so_far += c 
     if text_so_far in codes: 
      yield codes[text_so_far] 
      text_so_far = '' 
    if text_so_far: 
     yield text_so_far 

if __name__ == '__main__': 
    message = '10100010011' 
    codes = {97: '1', 98: '01', 107: '001', 114: '000'} 
    print(list(seach_replace(message, codes))) 

Ausgang:

[97, 98, 114, 97, 107, 97] 
+0

Wie unterscheidet sich * irgendein * von der Strategie von OP? Abgesehen von der Semantik wie mit einem Generator? – Shashank

+0

@Shashank: Ein Generator benötigt weniger Speicher, indem er keine kumulierte Liste erstellt. –