2

文字列形式の一連のトークンとして解析しようとしている大量の文字列がありますが、問題が見つかりました。文字列の多くは似ているため、string.replace()以前に置き換えられた文字が再び置き換えられることがあります。

置き換えられる文字列が「goto」であり、「41」(16進数)に置き換えられ、ASCII(「A」)に変換されるとします。後で、文字列 'A' も置換されるため、変換されたトークンが再び置換され、問題が発生します。

文字列を 1 回だけ交換するにはどうすればよいでしょうか? 元の文字列から各トークンを分割し、一度に 1 つずつ検索すると、非常に時間がかかります。

これは私が今持っているコードです。多かれ少なかれ機能しますが、それほど高速ではありません

# The largest token is 8 ASCII chars long
'out' is the string with the final outputs
while len(data) != 0:
    length = 8
    while reverse_search(data[:length]) == None:#sorry THC4k, i used your code 
                                                #at first, but it didnt work out 
                                                #for this and I was too lazy to
                                                #change it
        length -= 1
    out += reverse_search(data[:length])
    data = data[length:]
4

1 に答える 1

1

一度に文字列を置き換えようとしている場合は、辞書を使用できます。

translation = {'PRINT': '32', 'GOTO': '41'}
code = ' '.join(translation[i] if i in translation else i for i in code.split(' '))

これは基本的にO(2 | S | +(n * | dict |))です。とても早い。メモリ使用量はかなりの量になる可能性がありますが。置換を追跡することで、線形時間で問題を解決できますが、以前の置換を検索するコストを除外した場合に限ります。全体として、問題は本質的に多項式であるように思われます。

私が知らない辞書を介して文字列を翻訳する関数がPythonにない限り、これはそれを置く最も簡単な方法のようです。

それは変わります

10 PRINT HELLO
20 GOTO 10

の中へ

10 32 HELLO
20 41 10

これがあなたの問題と関係があることを願っています。

于 2010-08-22T19:23:07.250 に答える