2

だから私は以前にこれをやったことがあり、そのような一見単​​純なタスクのための驚くほど醜いコードです。

目標は、印刷できない文字を. (ドット)。私の目的では、「印刷可能」は最後の数文字string.printable(改行、タブなど) を除外します。これは、古い MS-DOS デバッグの「16 進ダンプ」形式などを出力するためのものです ... またはそれに類似したもの (空白を追加すると、意図したダンプ レイアウトが台無しになります)。

使用できることはわかっていstring.translate()ますが、それを使用するには、変換テーブルが必要です。だから私はそれに使いますstring.maketrans()。これが私が思いつくことができる最高のものです:

filter = string.maketrans(
   string.translate(string.maketrans('',''),
   string.maketrans('',''),string.printable[:-5]),
   '.'*len(string.translate(string.maketrans('',''),
   string.maketrans('',''),string.printable[:-5])))

...これは読めない混乱です(ただし、機能します)。

そこから、次のような use を呼び出すことができます。

for each_line in sometext:
    print string.translate(each_line, filter)

... そして、幸せになります。(ボンネットの下を見ない限り)。

この恐ろしい表現を別のステートメントに分割すると、より読みやすくなります。

ascii = string.maketrans('','')   # The whole ASCII character set
nonprintable = string.translate(ascii, ascii, string.printable[:-5])  # Optional delchars argument
filter = string.maketrans(nonprintable, '.' * len(nonprintable))

そして、読みやすさのためだけにそれを行うのは魅力的です.

しかし、私はこれをもっとエレガントに表現する方法がなければならないと考え続けています!

4

4 に答える 4

5

リスト内包表記を使用した別のアプローチは次のとおりです。

filter = ''.join([['.', chr(x)][chr(x) in string.printable[:-5]] for x in xrange(256)])
于 2009-11-26T00:20:08.363 に答える
4

ここでは「ASCII」が最も広く使用されていますが、あなたはその考えを理解しています

>>> import string
>>> ascii="".join(map(chr,range(256)))
>>> filter="".join(('.',x)[x in string.printable[:-5]] for x in ascii)
>>> ascii.translate(filter)
'................................ !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~.................................................................................................................................'

私がゴルフをしている場合は、おそらく次のようなものを使用してください。

filter='.'*32+"".join(map(chr,range(32,127)))+'.'*129
于 2009-11-26T00:19:56.063 に答える
1

実際のコードゴルフでは、string.maketransを完全に避けると思います

s=set(string.printable[:-5])
newstring = ''.join(x for x in oldstring if x in s else '.')

また

newstring=re.sub('[^'+string.printable[:-5]+']','',oldstring)
于 2009-11-26T00:19:01.907 に答える
1

この解決策は醜いとは思いません。確かに、正規表現ベースのソリューションよりも効率的です。これが少し短い解決策です。ただし、python2.6でのみ機能します。

nonprintable = string.maketrans('','').translate(None, string.printable[:-5])
filter = string.maketrans(nonprintable, '.' * len(nonprintable))
于 2009-11-26T00:19:21.090 に答える