1

私はPythonが初めてで、スクリプト/プログラムを書いています。

数値をテキストに変換したい。問題は、数字が何も区切られていないことです。

11349-->TEI

16342734410-->FEUERS

すでに定義されている文字の数は次のとおりです。

A=6 B=12 C=15 D=5 E=34 F=16 G=8 H=23 I=9 J=20 K=33 L=22 M=17 N=28 O=19 P=30 Q= 7 R=4 S=10 T=11 U=27 V=13 W=31 X=14 Y=29 Z=35 ß=18 Ö=32 Ü=24 Ä=25

16 は 1 と 6 として読み取れるため、太字の部分は問題があります。

番号 1、2、および 3 は私のリストでは定義されていないため、次の単一の番号と一緒に読み取る必要があります。

ここで、Python にこれを実行させる簡単な方法が必要です。

4

2 に答える 2

0
  1. キーをテキストのみに変換する16と、'16'

  2. これを「番号」をコード文字にマッピングするマップに保存します。

  3. 貪欲なアルゴリズムが望まれているようです。コード「番号」の最大長を調べ、その長さの移動ウィンドウを調べる必要があります。それが何にも一致しない場合は、リスト内で小さいものを検索し、ミスするまで続けます。ヒットすると、見つかった文字を出力し、一致したテキスト (数字) の直後から新しいウィンドウに進みます。


tablestr = '''A=6 B=12 C=15 D=5 E=34 F=16 G=8 H=23 I=9 J=20 K=33 L=22 M=17 N=28 O=19 P=30 Q=7 R=4 S=10 T=11 U=27 V=13 W=31 X=14 Y=29 Z=35 ß=18 Ö=32 Ü=24 Ä=25'''
translationtable = dict((k,v) for v,k in (pair.split('=') for pair in tablestr.split(' ')))
windowlen=2
def decodergen(codetext):
    windowstart = 0
    windowend = windowlen
    # stop when we get to the end of the input
    while windowend <= len(codetext):
       #reduce window until len 1 
       while windowend - windowstart >= 1:
          key = codetext[windowstart:windowend]
          #print key
          if key in translationtable:
             #setup new window
             windowstart = windowend
             windowend = windowstart + windowlen 
             yield translationtable[key]
             break # out of inner loop
          else:
             windowend -=1     
       if windowend - windowstart <= 0:
          raise ValueError('Could not locate translation for code input')

''.join(decodergen('16342734410')) #=> 'FEUERS'

はるかに短い実装を次に示します。

import re
rx = re.compile('|'.join(sorted(translationtable, key=len, reverse=True)))
print rx.sub(lambda m: translationtable[m.group()], '16342734410')

これは、キーの長さによる並べ替えに依存して、より長い一致を許可します。

于 2013-09-19T16:12:43.827 に答える