2015-11-03 11 views
8

Mam ten ciągzastępcze podciągi używania słownika w Pythonie

message = '10100010011' 

i tego słownika

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

i muszę zastąpić oryginalną wiadomość, korzystając ze słownika do czegoś takiego

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

Próbowałem swoją własną drogą, która działa, ale kiedy używam NAPRAWDĘ dużych ciągów, to po prostu bardzo wolno. Czy jest jakiś szybszy sposób na zrobienie tego niż to?

Widziałem odpowiedzi tutaj Easiest way to replace a string using a dictionary of replacements? i próbowałem, ale to nie działało dla mnie. Może dlatego, że mają do czynienia z całymi słowami, ale mam 1 długi ciąg 1s i 0s.

+3

nie jest twoim słowniku źle odwrotnie? A czy klucze (lub wartości, obecnie) nie mają stałej długości? – jonrsharpe

+0

@jonrsharpe zamienia pary klucz-wartość w roztworze. – Maroun

+0

@MarounMaroun oh ... to po co pokazywać to osobno ?! – jonrsharpe

Odpowiedz

-1

Po pierwsze, słownik codes powinien być w tył, aby ułatwić wyszukiwanie. Moja strategia polega na przeskanowaniu wiadomości po jednej postaci na raz. Jeśli znaleziony zamiennik zwróci go. Jeśli nie, dodaj następną postać i sprawdź ponownie. Rób tak, dopóki nie zostanie znaleziony zamiennik lub komunikat zostanie wyczerpany.

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

wyjściowa:

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

Czym to * jest * inne niż strategia OP? Poza semantyką jak używanie generatora? – Shashank

+0

@Shashank: generator zużywa mniej pamięci, nie tworząc zgromadzonej listy. –

Powiązane problemy