Python可能的列表推导式

4

我有一个文本文件和两个字符串列表。

第一个列表是关键词列表

k = [hi, bob]

第二个列表是我想要用来替换关键词的单词列表。
r = [ok, bye]

我希望将文本文件作为输入,其中出现k时被替换为r,因此,“hi,how are you bob”将更改为“ok,how are you bye”。


5
提示:先了解一下字典。 - Martijn Pieters
5
先学会走路再跑步:1.编写代码从文本文件中读取,一旦成功,然后2.用“ok”替换“hi”,如果这样行得通,3.继续替换成对的字符串。如果在任何阶段卡住了,请回到这里展示你的工作。 - Hai Vu
你找到解决问题的答案了吗? - Régis B.
2个回答

1
假设您已经解析了您的句子:

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 kk.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

0
我假设你已经掌握了“从文件中读取字符串”的部分,那么关于“替换多个字符串”的部分:首先,如Martijn所建议的,你可以使用dictzip创建一个字典,将键映射到替换值。
>>> 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接