2012-05-23 15 views
6

tengo una cadena como:prefijo coincidente en pitón

" This is such an nice artwork" 

y tengo una tag_list ["art","paint"]

Básicamente, quiero escribir una función que acepta esta cadena y taglist como entradas y me vuelve la palabra "obra de arte" como obra de arte contiene la palabra arte que está en taglist.

¿Cómo hago esto de la manera más eficiente?

Quiero que esto sea eficiente en términos de velocidad

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

Respuesta

7

intente lo siguiente:

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

Esto funciona porque str.startswith() puede aceptar una tupla de prefijos como argumento.

Tenga en cuenta que cambié el nombre de string a por lo que no hay ninguna ambigüedad con el módulo de cadena.

+0

Hey @ Andrew, cómo si quiero devolver la cadena no taglist la palabra? – indi60

2

Prueba esto:

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) 

El anterior devolverá una lista con todas las palabras de la cadena que coinciden con un prefijo en la lista de etiquetas.

1

Aquí hay una posible solución. Estoy usando regex, porque puedo deshacerme de los símbolos de puntuación fácilmente de esta manera. Además, estoy usando collections.Counter esto podría agregar eficiencia si su cadena tiene muchas palabras repetidas.

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

La última parte se puede hacer con la lista de comprensión:

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

Resultado:

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