我有一个文本文件和两个字符串列表。
第一个列表是关键词列表
k = [hi, bob]
第二个列表是我想要用来替换关键词的单词列表。
r = [ok, bye]
我希望将文本文件作为输入,其中出现k时被替换为r,因此,“hi,how are you bob”将更改为“ok,how are you bye”。
我有一个文本文件和两个字符串列表。
第一个列表是关键词列表
k = [hi, bob]
r = [ok, bye]
我希望将文本文件作为输入,其中出现k时被替换为r,因此,“hi,how are you bob”将更改为“ok,how are you bye”。
sentence = ['hi', 'how', 'are', 'you', 'bob']
k
中。如果是,就用r中相应的元素替换它;否则,使用实际的单词。换句话说:if word in k:
word_index = k.index(word)
new_word = r[word_index]
new_word = r[k.index(word)] if word in k else word
new_sentence = [r[k.index(word)] if word in k else word for word in sentence]
new_sentence
现在等于['ok','how','are','you','bye']
(这就是你想要的)。word in k
和k.index(word)
。这是低效的。可以通过从index
方法捕获异常来将这两个操作减少为一个:def get_new_word(word, k, r):
try:
word_index = k.find(word)
return r[word_index]
except ValueError:
return word
new_sentence = [get_new_word(word, k, r) for word in sentence]
word
是具有O(n)
复杂度的搜索(其中n
是关键字数量)。因此,此算法的复杂度为O(n.m)
(其中m是句子长度)。可以通过使用更合适的数据结构来将此复杂度降低到O(m)
,如其他评论所建议的。这留作练习 :-p
dict
和zip
创建一个字典,将键映射到替换值。>>> k = ["hi", "bob"]
>>> r = ["ok", "bye"]
>>> d = dict(zip(k, r))
现在,一种替换所有这些键的方法是使用正则表达式,即在您的示例中为所有这些键的分离,即"hi|bob"
,并使用替换函数的re.sub
,在该字典中查找相应的键。
>>> import re
>>> re.sub('|'.join(k), lambda m: d[m.group()], "hi, how are you bob")
'ok, how are you bye'
或者,您可以使用循环逐个替换每个键值对:
s = "hi, how are you bob"
for (x, y) in zip(k, r):
s = s.replace(x, y)