Python入门实例——伪·人工智能对话为例学习Str中的maketrans与translate方法

起源

一开始对Python感兴趣除了自己长期想真正学习一门编程语言,也有一些契机,其中便有一个颇为搞笑的实例,他的原理大概是把输入内容中的“吗”去掉,把问号变成感叹号,以形成一种看似在对话的效果。大概感觉如下:

#你在吗?
>我在的!
#你听得懂中文吗?
>我听得懂中文!

当时好奇之下自己也稍微实现了大概的效果。
但是其中还是不乏有些疑惑,因为这样的效果大部分的实现方法是

while True:
	print(input().replace("吗?","!").replace("你","我"))

问题

然而问题就来了,当我输入

#你爱我吗?
>我爱我!

便出现了这种情况。
直觉上我们似乎应该把在代码后面再追加一条“replace(“我”,“你”)”
但是这种情况下又很容易看出,输出结果只会变成“你爱你!”
因为在这种替换下他会把先前替换的内容也替换掉。

解决

那么这样该如何呢?
当时想到的比较复杂的方法是将一句转为一个List然后逐个成员进行replace再进行合并,但总感觉这种方法有点不美。
于是又想到Dict类型中可以建立一种对应关系如:

{"?":"!","你":"我"}

而对于str类型,则有maketrans和translate两个方法。
简单来说maketrans是使用Dict类型来生成一个字符的映射表。
而translate则是使用映射表对str中的内容进行逐个映射。
这样我们的思路就很清晰了。

while True:
    text = input("Send:")
    table =text.maketrans({"我":"你","你":"我","吗":"","?":"!","?":"!"})
    print(text.translate(table))

深入

maketrans也可以接受两个参数。
如果只有一个参数,则只能接受dict类型。

#此处用一个空白的str来调用maketrans
t = ''.maketrans("我","你")
#而如果我们用type查看其类型,则会发现就是个dict
type(t)
#output:  
#如果我们把t输出呢?
print(t)
#output: {25105: 20320}
#确实是dict,但是中文被转为了unicode

需要注意的是在之前的情况下我们定义了一个dict

{"?":"!","你":"我"}

而在这个情况下,其中的"?“与”!"以及"你"与"我"是一一对应的。
在两个参数如maketran(‘我爱你’,‘你爱我’)的情况下。
他并不是将a参数简单的替换为b参数。
例如上面的例子里我们改为

t = ''.maketrans("我爱你","你爱我")
"我真的很爱你".translate(t)
#output: '你真的很爱我'

其实就是分开后一一对应:我->你;爱->爱;你->我
当maketrans接受三个参数的时候呢?

 t = ''.maketrans("我爱你","你爱我","爱")
t
#output: {25105: 20320, 29233: None, 20320: 25105}

我们发现其中"20105"对应”20320“也就是”我“对应”你“以及”你“对“我”。
而“29233”则被替换成了None,也就是空的意思。
并且即使我们在maketrans中设置了爱对应爱。
在第三个参数中的字符串也会一样被替换为空。
此时如果我们输入

"我爱你".translate(t)
#output: '你我'

则就出现了以上的结果。
也就是当maketrans接受三个参数时,第三个参数表示会清空对应值,无论先前是否有对应的映射关系。

你可能感兴趣的:(python,编程语言)