为什么string.maketrans在Python 3.1中不起作用?

siv*_*udh 18 python python-3.x

我是一个Python新手.

为什么在Python 3.1中不起作用?

from string import maketrans   # Required to call maketrans function.

intab = "aeiou"
outtab = "12345"
trantab = maketrans(intab, outtab)

str = "this is string example....wow!!!";
print str.translate(trantab);
Run Code Online (Sandbox Code Playgroud)

当我执行上面的代码时,我得到以下代码:

Traceback (most recent call last):
  File "<pyshell#119>", line 1, in <module>
    transtab = maketrans(intab, outtab)
  File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/string.py", line 60, in maketrans
    raise TypeError("maketrans arguments must be bytes objects")
TypeError: maketrans arguments must be bytes objects
Run Code Online (Sandbox Code Playgroud)

"必须是字节对象"是什么意思?如果有可能,有人可以帮助发布Python 3.1的工作代码吗?

小智 33

您不需要使用bytes.maketrans()何时str更简单并且不需要'b'前缀:

print("Swap vowels for numbers.".translate(str.maketrans('aeiou', '12345')))
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 16

通过阅读Python 2文档停止尝试学习Python 3.

intab = 'aeiou'
outtab = '12345'

s = 'this is string example....wow!!!'

print(s.translate({ord(x): y for (x, y) in zip(intab, outtab)}))
Run Code Online (Sandbox Code Playgroud)

  • 对于一种狡猾的态度倾诉.所以你有423k积分.回答与Guido相同的问题 - _that's_ pythonic. (13认同)
  • 使用官方docs.python.org:版本写在每个页面的顶部.HTH (7认同)
  • 请原谅,但作为一个新手,我不知道哪个是P2 doc,哪个是P3.谢谢你的代码. (5认同)

S.L*_*ott 11

字符串不是字节.

这是Python 3中的一个简单定义.

字符串是Unicode(不是字节)Unicode字符串使用"..."'...'

字节是字节(不是字符串)字节字符串使用b"..."b'...'.

使用b"aeiou"创建某些字母的ASCII码组成的字节序列.


Man*_*way 7

在Python 3中,string.maketrans()功能已被废弃,由新的静态方法所取代,bytes.maketrans()bytearray.maketrans().

此更改解决了字符串模块支持哪些类型的混淆.

现在str,bytesbytearray每个人都有自己maketranstranslate方法与适当类型的中间转换表.


小智 5

"this is string example....wow!!!".translate(str.maketrans("aeiou","12345"))
Run Code Online (Sandbox Code Playgroud)

这有效,并且不需要其他字节转换。我不知道为什么使用字节而不是str的原因。