替换大型python字典中的字符串

替换大型python字典中的字符串,python,dictionary,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(k

我有一本这样的字典:

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)

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

在循环中使用
str.replace
效率非常低。有几个论点:

  • 替换单词时,将分配一个新字符串,并丢弃旧字符串。如果你有很多单词,可能需要很长时间
  • str.replace
    将替换单词内部,可能不是您想要的:例如:将“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

(请注意,最后一个单词没有替换,因为它只是部分匹配)

在循环中使用
str.replace
,效率非常低。有几个论点:

  • 替换单词时,将分配一个新字符串,并丢弃旧字符串。如果你有很多单词,可能需要很长时间
  • str.replace
    将替换单词内部,可能不是您想要的:例如:将“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

(请注意,最后一个单词没有被替换,因为它只是部分匹配)

当前代码使用了多少时间和内存?您可以使用这些键动态构建一个正则表达式并使用它运行替换。(可能需要一个更好的正则表达式引擎来提高效率。)看起来你可以通过循环中的几个报告来提高速度。你当前的代码是正确的吗?例如,如果我将
str
设置为
“我有35014只山羊。”
,那么您可以将其更改为
“我有3只玫瑰4只山羊。”
…旁白:不要使用
str
作为变量名,因为它是python字符串类。您当前的代码使用了多少时间和内存?您可以使用这些键动态构建正则表达式,并使用它运行替换。(可能需要一个更好的正则表达式引擎来提高效率。)看起来你可以通过循环中的几个报告来提高速度。你当前的代码是正确的吗?例如,如果我将
str
设置为
“我有35014只山羊。”
,那么您可以将其更改为
“我有3Rose4只山羊。”
…旁白:不要将
str
用作变量名,因为它是python字符串类。