使用字符串.翻译()

2024-10-03 13:23:01 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我以前做过,对于这样一个看似简单的任务来说,这是一个令人惊讶的丑陋代码。在

目标是将任何不可打印字符转换为(点)。出于我的目的,“printable”确实排除了string.printable(新行、制表符等)中的最后几个字符。这是用来打印旧的MS-DOS调试“十六进制转储”格式。。。或者类似的内容(额外的空白会破坏预期的转储布局)。在

我知道我可以使用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,比如:

^{pr2}$

。。。要快乐。(只要你不看引擎盖下面)。在

现在,如果我把这个可怕的表达式分解成单独的语句,就更易读了:

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

为了易读性而这么做是很有诱惑力的。在

然而,我一直在想,必须有一个更优雅的方式来表达这一点!在


Tags: 代码目的目标stringlenasciifilter字符
3条回答

对于实际的代码高尔夫,我想你应该避免字符串.maketrans完全

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

或者

^{pr2}$

这里最广泛的用法是“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{|}~.................................................................................................................................'

如果我在打高尔夫球,可能会用这样的方法:

^{pr2}$

下面是另一种使用列表理解的方法:

filter = ''.join([['.', chr(x)][chr(x) in string.printable[:-5]] for x in xrange(256)])

相关问题 更多 >