7

我有一个像这样的字符串:

" This is such an nice artwork"

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

基本上,我想编写一个函数,它接受这个字符串和 taglist 作为输入并返回“艺术品”这个词,因为艺术品包含 taglist 中的艺术字。

我如何最有效地做到这一点?

我希望这在速度方面是有效的

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

3 回答 3

11

尝试以下操作:

def prefix_match(sentence, taglist):
    taglist = tuple(taglist)
    for word in sentence.split():
        if word.startswith(taglist):
            return word

这是可行的,因为str.startswith()可以接受前缀元组作为参数。

请注意,我重命名为stringsentence因此字符串模块没有任何歧义。

于 2012-05-23T22:07:55.700 回答
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)

上面将返回一个列表,其中包含字符串中与标签列表中的前缀匹配的所有单词。

于 2012-05-23T22:10:49.303 回答
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)]
于 2012-05-23T22:50:58.873 回答