2012-05-23 4 views
6

Ich habe eine Zeichenfolge wie:Abgleich von Präfixen in Python

" This is such an nice artwork" 

und ich habe eine tag_list ["art","paint"]

Grundsätzlich möchte ich eine Funktion schreiben, die diese Zeichenfolge und taglist als Eingänge akzeptiert und gibt mir Das Wort "Artwork" als Artwork enthält das Wort Art, das in der Taglist steht.

Wie mache ich das am effizientesten?

Ich möchte diese

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

Antwort

7

Versuchen Sie Folgendes in Bezug auf die Geschwindigkeit effizient sein:

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

Das funktioniert, weil str.startswith() ein Tupel von Präfixen als Argument akzeptieren.

Beachten Sie, dass ich string in sentence umbenannte, so dass es keine Unklarheit mit dem String-Modul gibt.

+0

hey @ Andrew, wie Wenn ich will, nicht das Wort, um die taglist String zurück

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)) 

Der letzte Teil kann mit Liste Verständnis getan werden? – indi60

2

Try this:

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) 

Die oben wird eine Liste mit allen Wörtern in der Zeichenfolge zurück, die ein Präfix in der Liste der Tags entsprechen.

1

Hier ist eine mögliche Lösung. Ich benutze regex, weil ich Interpunktionssymbole auf diese Weise leicht loswerden kann. Außerdem verwende ich collections.Counter das könnte Effizienz hinzufügen, wenn Ihre Zeichenfolge viele wiederholte Wörter hat.

words_found = [[(k,v) for k,v in dicto.iteritems() if found(k,tag)] for tag in tag_list] 

Ergebnis:

>>> words_found 
[('artwork', 2), ('painting', 1)] 
Verwandte Themen