7

次のような文字列があります。

" This is such an nice artwork"

そして私はtag_listを持っています["art","paint"]

基本的に、この文字列とタグリストを入力として受け入れ、アートワークにはタグリストにあるアートという単語が含まれているため、「アートワーク」という単語を返す関数を書きたいと思います。

これを最も効率的に行うにはどうすればよいですか?

これを速度の面で効率的にしたい

 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()は、プレフィックスのタプルを引数として受け入れることができるため機能します。

string モジュールにあいまいさがないように名前を変更stringしたことに注意してください。sentence

于 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 に答える