如何使用字典映射替换字符串中的单词

A.P*_*apa 2 python string dictionary python-3.x

我有以下句子

a = "you don't need a dog"
Run Code Online (Sandbox Code Playgroud)

和一本字典

dict =  {"don't": "do not" }
Run Code Online (Sandbox Code Playgroud)

但我不能使用字典来使用下面的代码映射句子中的单词:

''.join(str(dict.get(word, word)) for word in a)
Run Code Online (Sandbox Code Playgroud)

输出:

"you don't need a dog"
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

jpp*_*jpp 9

这是一种方式.

a = "you don't need a dog"

d =  {"don't": "do not" }

res = ' '.join([d.get(i, i) for i in a.split()])

# 'you do not need a dog'
Run Code Online (Sandbox Code Playgroud)

说明

  • 永远不要在课后命名变量,例如使用d而不是dict.
  • 用于str.split按空格分割.
  • 不需要str包含已经是字符串的值.
  • str.join工作略好与列表理解与发电机的表达.


Mat*_*ias 6

所有答案都是正确的,但如果你的句子很长并且映射字典很小,你应该考虑迭代字典的项目(键值对)并将 str.replace 应用于原始句子。

其他人建议的代码。每个循环需要6.35 µs

%%timeit

search = "you don't need a dog. but if you like dogs, you should think of getting one for your own. Or a cat?"
mapping =  {"don't": "do not" }

search = ' '.join([mapping.get(i, i) for i in search.split()])
Run Code Online (Sandbox Code Playgroud)

让我们尝试使用 str.replace 代替。每个循环需要633 ns

%%timeit 

search = "you don't need a dog. but if you like dogs, you should think of getting one for your own. Or a cat?"
mapping =  {"don't": "do not" }

for key, value in mapping.items():
    search = search.replace(key, value)
Run Code Online (Sandbox Code Playgroud)

让我们使用 Python3 列表理解。所以我们得到了最快的版本,每个循环需要1.09 µs

%%timeit 

search = "you don't need a dog. but if you like dogs, you should think of getting one for your own. Or a cat?"
mapping =  {"don't": "do not" }

search = [search.replace(key, value) for key, value in mapping.items()][0]
Run Code Online (Sandbox Code Playgroud)

你看出区别了吗?对于您的短句,第一个和第三个代码的速度大致相同。但是句子(搜索字符串)越长,性能差异就越明显。

结果字符串为:

'你不需要狗。但如果你喜欢狗,你应该考虑为自己养一只。还是一只猫?

备注: str.replace 也将替换长连接词中的出现。需要确保仅对完整单词进行替换。我想 str.replace 有一些选项。另一个想法是使用本帖中解释的正则表达式,因为它们也处理小写和大写。查找字典中的尾随空格不起作用,因为您不会在句子的开头或结尾找到出现的内容。

  • `search = [search.replace(key, value) for key, value inapping.items()][0]` 如果您的映射字典有多个术语,它将仅返回第一个替换项。 (2认同)

归档时间:

查看次数:

2870 次

最近记录:

7 年,11 月 前