python中的前缀匹配

时间:2012-05-23 22:02:56

标签: python

我有一个字符串:

" This is such an nice artwork"

我有一个tag_list ["art","paint"]

基本上,我想编写一个接受此字符串和taglist作为输入的函数 并将“艺术品”一词归还给我,因为艺术品包含了标签列表中的艺术字。

我如何最有效地完成这项工作?

我希望这在速度方面效率很高

 def prefix_match(string, taglist):
        # do something here
     return word_in string

3 个答案:

答案 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)]