从巨大的python字典中替换字符串

时间:2017-07-10 19:20:46

标签: python dictionary

我有这样的字典:

id_dict = {'C1001': 'John','D205': 'Ben','501': 'Rose'}

这本词典有超过10000个键和值。我必须从一个有近500字的报告中搜索密钥并用值替换。 我必须在几分钟内处理成千上万的报告,因此速度和记忆对我来说非常重要。

这是我现在使用的代码:

str = "strings in the reports"
for key, value in id_dict.iteritems():
    str = str.replace(key, value)

有没有比这更好的解决方案?

1 个答案:

答案 0 :(得分:2)

在循环中使用str.replace非常低效。一些论点:

  • 替换单词时,将分配一个新字符串,并丢弃旧字符串。如果你有很多单词,可能需要很长时间
  • str.replace会替换单词内部,可能不是你想要的:ex:将“nut”替换为“eel”将“donut”改为“doeel”。
  • 如果你的替换词典里有很多单词,你就会循环遍历所有单词(使用python循环,相当慢),即使文本中不包含其中任何一个。

我会将re.sub与替换函数(作为lambda)一起使用,匹配字边界的字母数字字符串(字母或数字)。

lambda将在字典中查找并返回单词(如果找到),否则返回原始单词,不替换任何内容,但由于所有内容都在re模块中完成,因此执行速度更快。

import re

id_dict = {'C1001': 'John','D205': 'Ben','501': 'Rose'}

s = "Hello C1001, My name is D205, not X501"

result = re.sub(r"\b(\w+)\b",lambda m : id_dict.get(m.group(1),m.group(1)),s)

print(result)

打印:

Hello John, My name is Ben, not X501

(请注意,最后一个单词未放置,因为它只是部分匹配)