2015-11-03 22 views
8

ho questa stringasottostringhe sostitutivi con un dizionario in Python

message = '10100010011' 

e questo dizionario

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

e ho bisogno di sostituire il messaggio originale utilizzando il dizionario a qualcosa di simile

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

Ho provato a modo mio, il che funziona, ma quando uso alcune stringhe DAVVERO grandi, è davvero molto lento. C'è un modo più veloce per fare questo di questo?

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 = "" 

ho visto le risposte qui Easiest way to replace a string using a dictionary of replacements? e ho provato, ma che non ha funzionato per me. Forse perché hanno a che fare con parole intere, ma ho una lunga stringa di 1 e 0.

+3

Non è il dizionario nel modo sbagliato? E le chiavi (o i valori, al momento) non dovrebbero avere una lunghezza fissa? – jonrsharpe

+0

@jonrsharpe sta scambiando i valori-chiave nella soluzione. – Maroun

+0

@MarounMaroun oh ... allora perché mostrarlo separatamente ?! – jonrsharpe

risposta

-1

Prima di tutto, il dizionario codes deve essere retrocesso per facilitare la ricerca. La mia strategia è scansionare il messaggio un carattere alla volta. Se viene trovato un sostituto, restituirlo. Altrimenti, aggiungi il prossimo carattere e guarda di nuovo. Continuate fino a quando non viene trovato un sostituto o il messaggio è esaurito.

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

uscita:

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

Com'è questa * qualsiasi * diversa dalla strategia di OP? A parte la semantica come usare un generatore? – Shashank

+0

@Shashank: un generatore utilizza meno memoria non creando un elenco accumulato. –

Problemi correlati