我有一个字符串:
" This is such an nice artwork"
我有一个tag_list ["art","paint"]
基本上,我想编写一个接受此字符串和taglist作为输入的函数 并将“艺术品”一词归还给我,因为艺术品包含了标签列表中的艺术字。
我如何最有效地完成这项工作?
我希望这在速度方面效率很高
def prefix_match(string, taglist):
# do something here
return word_in string
答案 0 :(得分:8)
尝试以下方法:
def prefix_match(sentence, taglist):
taglist = tuple(taglist)
for word in sentence.split():
if word.startswith(taglist):
return word
这是有效的,因为str.startswith()
可以接受前缀元组作为参数。
请注意,我将string
重命名为sentence
,因此字符串模块没有任何歧义。
答案 1 :(得分:2)
试试这个:
def prefix_match(s, taglist):
words = s.split()
return [w for t in taglist for w in words if w.startswith(t)]
s = "This is such an nice artwork"
taglist = ["art", "paint"]
prefix_match(s, taglist)
上面将返回一个列表,其中包含字符串中与标签列表中的前缀匹配的所有单词。
答案 2 :(得分:1)
这是一个可能的解决方案。我正在使用regex
,因为我可以通过这种方式轻松摆脱标点符号。此外,我正在使用collections.Counter
如果您的字符串有很多重复的单词,这可能会提高效率。
tag_list = ["art","paint"]
s = "This is such an nice artwork, very nice artwork. This is the best painting I've ever seen"
from collections import Counter
import re
words = re.findall(r'(\w+)', s)
dicto = Counter(words)
def found(s, tag):
return s.startswith(tag)
words_found = []
for tag in tag_list:
for k,v in dicto.iteritems():
if found(k, tag):
words_found.append((k,v))
最后一部分可以用列表理解来完成:
words_found = [[(k,v) for k,v in dicto.iteritems() if found(k,tag)] for tag in tag_list]
结果:
>>> words_found
[('artwork', 2), ('painting', 1)]